Pytanie jest proste, ale nie jestem pewien, że to możliwe, aby to zrobić ...Jak rozszerzyć klasę, która wraca to w swoich metodach
jeśli mamy klasę jak
class A {
private int foo;
public A(int bar) {
this.foo = bar;
}
public A setFoo(int bar) {
this.foo = bar;
return this;
}
public int getFoo() {
return this.foo;
}
public void doSomething() {
this.foo++;
}
}
widzimy, że jest to po prostu klasa z prywatnym członkiem i seter/getter. Ciekawostką jest, że w celu umożliwienia łączenia metod, setter wraca this
.
Więc możemy robić rzeczy tak:
A a = new A(0);
a.setFoo(1).doSomething();
Problem polega na tym, kiedy staram się rozszerzyć, że klasa dodać niektóre funkcje wykonawcze interfejs podobny do tego
class B extends A implements I {
public B(int bar) {
this.super(bar);
}
public void methodI() {
// whatever
}
}
To wydaje się ok, dopóki Zaczynam go używać w ten sposób:
B b = new B(1);
b.setFoo(2).methodI();
Ponieważ setFoo
jest rzeczywiście retu rning wystąpienie A
, a nie instancja B
, aw A methodI
nie istnieje ...
Jakiekolwiek obejście? Dzięki.
Nawiasem mówiąc, po prostu napisał podstawowy kod wystarczy, aby zrozumieć, ale jeśli chcesz wiedzieć więcej, jestem po prostu staramy się rozszerzyć niektóre z podstawowych klas libgdx (jak Math.Vector2
, Math.Vector3
) do implementuj Poolable.
Czy próbowałeś rzucić? '((B) b.setFoo (2)). methodI() '? –
@Ori Lentz Tak, ale nie mam ochoty na casting za każdym razem, gdy wydaje się, że jest bardziej naturalna odpowiedź. Oczywiście nie wiem, czy to możliwe, więc pytam przed napisaniem jakiegoś brudnego kodu: P – danikaze
Dlaczego potrzebujesz wektory do wdrożenia Poolable? Nie muszą tego implementować, aby móc pracować z pulą i zazwyczaj zawsze masz jakąś wartość, aby początkowo ją ustawić, gdy ją uzyskasz, więc naprawdę nie ma potrzeby stosowania metody "reset()". Powodem, dla którego pytam, jest to, że jeśli istnieje dobry powód, równie dobrze można go dodać do źródła. – Tenfour04