Когда я программирую на Java (или аналогичном языке), я часто использую простую версию шаблона Strategy, используя интерфейсы и классы реализации, чтобы обеспечить реализационные реализации определенной концепции в моем коде. p >
Как очень надуманный пример, я могу захотеть иметь общую концепцию 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 коде, чтобы я мог выбрать конкретную реализацию абстрактного понятия во время выполнения. Или использует черты лучший способ достичь этого?