Когда я программирую на Java (или аналогичном языке), я часто использую простую версию шаблона Стратегии, используя интерфейсы и классы реализации, для обеспечения реализации в моем коде реализации конкретной концепции, выбираемой во время выполнения.
В качестве очень надуманного примера мне может понадобиться общая концепция Animal, которая может создавать помехи в моем Java-коде, и хотеть иметь возможность выбирать тип животного во время выполнения.Таким образом, я написал бы следующий код:
interface Animal {
void makeNoise();
}
class Cat extends Animal {
void makeNoise() { System.out.println("Meow"); }
}
class Dog extends Animal {
void makeNoise() { System.out.println("Woof"); }
}
class AnimalContainer {
Animal myAnimal;
AnimalContainer(String whichOne) {
if (whichOne.equals("Cat"))
myAnimal = new Cat();
else
myAnimal = new Dog();
}
void doAnimalStuff() {
...
// Time for the animal to make a noise
myAnimal.makeNoise();
...
}
Достаточно просто.Однако недавно я работал над проектом в Scala и хочу сделать то же самое.Кажется, достаточно просто сделать это, используя черты, например:
trait Animal {
def makeNoise:Unit
}
class Cat extends Animal {
override def makeNoise:Unit = println("Meow")
}
class AnimalContainer {
val myAnimal:Animal = new Cat
...
}
Однако это кажется очень похожим на Java и не очень функциональным - не говоря уже о том, что черты и интерфейсы не действительно то же самое.Поэтому мне интересно, есть ли более идиоматический способ реализации шаблона Стратегии - или что-то вроде этого - в моем коде Scala, чтобы я мог выбрать конкретную реализацию абстрактной концепции во время выполнения.Или использование черт - лучший способ достичь этого?