जब मैं जावा (या एक समान भाषा) में प्रोग्रामिंग कर रहा हूं, तो मैं अक्सर अपने कोड में किसी विशेष अवधारणा के रनटाइम-चयन योग्य कार्यान्वयन प्रदान करने के लिए इंटरफेस और कार्यान्वयन कक्षाओं का उपयोग करके रणनीति पैटर्न का एक सरल संस्करण नियोजित करता हूं।स्कैला में रणनीति पैटर्न के लिए बेहतर विकल्प?
एक बहुत ही संकलित उदाहरण के रूप में, मैं एक ऐसे जानवर की सामान्य अवधारणा लेना चाहता हूं जो मेरे जावा कोड में शोर कर सके और रनटाइम पर जानवर के प्रकार का चयन करने में सक्षम होना चाहें। तो मैं इन पंक्तियों के साथ कोड लिखूंगा:
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();
...
}
काफी सरल। हाल ही में, हालांकि, मैं स्कैला में एक परियोजना पर काम कर रहा हूं और मैं वही काम करना चाहता हूं। यह आसान यह लक्षण का उपयोग कर करने के लिए पर्याप्त लगता है, कुछ इस तरह के साथ:
trait Animal {
def makeNoise:Unit
}
class Cat extends Animal {
override def makeNoise:Unit = println("Meow")
}
class AnimalContainer {
val myAnimal:Animal = new Cat
...
}
बहरहाल, यह बहुत जावा की तरह है और बहुत कार्यात्मक लगता है - करने के लिए है कि लक्षण और इंटरफेस वास्तव में नहीं हैं उल्लेख नहीं वही चीज। इसलिए मैं सोच रहा हूं कि रणनीति पैटर्न को लागू करने के लिए एक और बेवकूफ तरीका है - या ऐसा कुछ - मेरे स्कैला कोड में ताकि मैं रनटाइम पर एक अमूर्त अवधारणा के ठोस कार्यान्वयन का चयन कर सकूं। या यह प्राप्त करने के लिए लक्षणों का सबसे अच्छा तरीका उपयोग कर रहा है?
धन्यवाद, डैनियल! मैंने इस जवाब का चयन किया क्योंकि यह पूर्व-मौजूदा कोड (जो कार्यात्मक से अधिक ओओ है) के लिए मित्रवत है। @ वोनसी का जवाब भी अच्छा है, और मैं इसे अधिक कार्यात्मक में काम करते समय शायद इसका उपयोग करूंगा कोड बेस – MattK