【发布时间】:2017-12-01 17:37:04
【问题描述】:
抱歉,如果之前有人问过这个问题,但是我无法找到真正解释如何实现或解决我的问题的答案。
我面临的问题是如何在不询问第一个对象的情况下将代码拆分为单独的类。例如,多态性最常见的解释是:
abstract class Animal {
abstract String talk();
}
class Cat extends Animal {
String talk() {
return "Meow!";
}
}
class Dog extends Animal {
String talk() {
return "Woof!";
}
}
void letsHear(final Animal a) {
println(a.talk());
}
int main() {
letsHear(new Cat());
letsHear(new Dog());
}
但是,如果我知道我想创建一个新的狗和一个新的猫怎么办。如果这是用户填写的表格,他们可以选择猫或狗。目前我会写下这个问题的解决方案:
abstract class Animal {
abstract String talk();
}
class Cat extends Animal {
String talk() {
return "Meow!";
}
}
class Dog extends Animal {
String talk() {
return "Woof!";
}
}
void letsHear(final Animal a) {
println(a.talk());
}
int main() {
string userInput = Console.ReadLine();
switch(userInput){
case "Cat":
letsHear(new Cat());
break;
case "Dog":
letsHear(new Dog());
break;
}
}
必须有比使用 case 语句找出用户选择哪个 ID 来创建类更好的解决方案。如果问题没有意义,或者这可能是解决此问题的最佳方法,请告诉我。我知道我的代码无法编译或工作,但这更多是一个架构问题,而不是具体的工作代码。
【问题讨论】:
-
除非您的语言允许将字符串作为代码执行(例如,Javascript 允许这样做),否则需要切换输入。理想情况下,这种用于实例化对象的输入切换应该发生在应用程序的外围(数据进入的地方,在您的情况下,这是控制台)。您正在 main() 中进行此切换,建议@aendeerei 将逻辑提取到工厂,但这并没有真正的区别,因为切换需要在某个地方进行。只有在多个地方使用 Animal 类型时,多态的好处才会真正显现出来。
-
我同意@jrahhali。好主意,杰拉哈利! ;-) 事实上,如果您直接决定应该创建哪个动物的“客户端”部分,那么您可以将输入与要在 main 中创建的类名结合起来。
标签: class oop inheritance polymorphism abstract-class