0
抽象クラスを拡張するクラスから抽象スーパークラスの配列に特定のメソッドを呼び出そうとしています。それを行う可能性はありますか?抽象クラスからの配列の拡張クラスからメソッドを呼び出す
users[findUser(userName)].setVehicle(vehicles[counterVehicles])
抽象クラスを拡張するクラスから抽象スーパークラスの配列に特定のメソッドを呼び出そうとしています。それを行う可能性はありますか?抽象クラスからの配列の拡張クラスからメソッドを呼び出す
users[findUser(userName)].setVehicle(vehicles[counterVehicles])
あなたがusers[findUser(userName)]
の結果は常に、あなたがこれを行うことができ、特定のタイプのあることがわかっている場合:
((ConcreteUser)users[findUser(userName)]).setVehicle(vehicles[counterVehicles])
そうでない場合は、あなたが電話をかける前にinstanceof
特定のタイプでテストする必要があります。
これをすべて避けるには、ビジターパターンを実装することをおすすめします。これは、それができるかです:今
interface UserVisitor {
public void visit(ConcreteUser1 user1);
public void visit(ConcreteUser2 user2);
}
static class VehicleVisitor implements UserVisitor {
private Vehicle vehicle;
private Bus bus;
VehicleVisitor(Vehicle vehicle, Bus bus) {
this.vehicle = vehicle;
this.bus = bus;
}
public void visit(ConcreteUser1 user1) {
user1.setVehicle(vehicle);
}
public void visit(ConcreteUser2 user2) {
user2.setBus(bus);
}
}
static abstract class AbstractUser {
public abstract void accept(VehicleVisitor visitor);
}
static class ConcreteUser1 extends AbstractUser {
private Vehicle vehicle;
public void accept(VehicleVisitor visitor) {
visitor.visit(this);
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
public Vehicle getVehicle() {
return vehicle;
}
}
static class ConcreteUser2 extends AbstractUser {
private Bus bus;
public void accept(VehicleVisitor visitor) {
visitor.visit(this);
}
public void setBus(Bus bus) {
this.bus = bus;
}
public Bus getBus() {
return bus;
}
}
static class Vehicle {
@Override
public String toString() {
return "CAR";
}
}
static class Bus {
@Override
public String toString() {
return "BUS";
}
}
public static void main(String[] args) {
List<AbstractUser> users = new ArrayList<AbstractUser>();
ConcreteUser1 user1 = new ConcreteUser1();
users.add(user1);
ConcreteUser2 user2 = new ConcreteUser2();
users.add(user2);
for (AbstractUser user : users) {
VehicleVisitor visitor = new VehicleVisitor(new Vehicle(), new Bus());
user.accept(visitor);
}
System.out.println(user1.getVehicle());
System.out.println(user2.getBus());
}
、私はそれを短くする例の1人の訪問者を持っていますが、あなたはそれらのそれぞれが、異なるタイプのユーザに異なることをやって、来場者の複数のタイプを持つことができます。
対処しようとしているインターフェイスは何ですか? – ifly6
'AbstractClassExtension.method(super.array)'?しかし、正確なデータ構造が何であるかわからない限り、正しいことはありません。 – ifly6