我建议您选择一种访客模式。我用Java做了一个小的实现。我不熟悉Swift,但是您可以轻松地对其进行调整。
访客
public interface AnimalVisitor<R>{
R visitCat();
R visitDog();
}
您的模特
abstract class Animal { // can also be an interface like VisitableAnimal
abstract <R> R accept(AnimalVisitor<R> visitor);
}
class Cat extends Animal {
public <R> R accept(AnimalVisitor<R> visitor) {
return visitor.visitCat();
}
}
class Dog extends Animal {
public <R> R accept(AnimalVisitor<R> visitor) {
return visitor.visitDog();
}
}
致电访客
public void tryToDelete(Animal animal) {
animal.accept( new AnimalVisitor<Void>() {
public Void visitCat() {
tellSceneToShowConfirmation();
return null;
}
public Void visitDog() {
deleteModel(animal);
return null;
}
});
}
您可以根据需要拥有任意多个AnimalVisitor的实现。
例:
public void isColorValid(Color color) {
animal.accept( new AnimalVisitor<Boolean>() {
public Boolean visitCat() {
return Color.BLUE.equals(color);
}
public Boolean visitDog() {
return true;
}
});
}
Dog
和Cat
被描述为类,同时Animal
是可以被每个这些类的实现的协议。因此,问题和答案之间有些不符。