我确信这与以Java为中心的OOP非常相似。在java中有一种方法可以创建一个接受所有继承子类型的基类型变量吗?就像我有;
class Mammal {...}
class Dog extends Mammal {...}
class Cat extends Mammal {...}
class ABC {
private Mammal x;
ABC() {
this.x = new Dog();
-or-
this.x = new Cat();
}
}
我需要变量才能接受任何扩展版本,但不能用于特定的扩展版本。
我知道有一些方法,但不想使用。我可以为每个子类型创建一个属性,然后只有实际使用的一个属性。制作一个数组并将其推入那里。
获取“基类”类型变量的任何其他想法或方法?
好的,因为我知道在Java中使用多态鸭打字不是一个好主意,但因为我不认为我可以避免它。是动态使用子类方法重新分配变量的转换版本的唯一方法,即我得到一个错误;
Mammal x;
x = new Dog();
System.out.println(x.getClass());
x.breath();
if (x instanceof Dog) {
x.bark();
} else if (x instanceof Cat) {
x.meow();
}
说没有找到符号,但这有效;
Mammal x;
x = new Dog();
System.out.println(x.getClass());
x.breath();
if (x instanceof Dog) {
Dog d = (Dog) x;
d.bark();
} else if (x instanceof Cat) {
Cat c = (Cat) x;
c.meow();
}
最后一个是唯一的方法吗?
答案 0 :(得分:1)
如果您有以下内容:
class Mammal {...}
class Dog extends Mammal {...}
class Cat extends Mammal {...}
然后Dog
是Mammal
的子类型。 Cat
也是Mammal
的子类型。事实上,这种类型的多态性允许您执行以下操作:
Mammal x;
x = new Dog(); // fine!
x = new Cat(); // also fine!
如果实际上后来有以下内容:
class Platypus extends Mammal {...} // yes it's true!
然后你也可以这样做:
x = new Platypus(); // fine!
这种多态的子类型关系是面向对象编程的基本原则之一。
Subtype polymorphism,在面向对象编程的上下文中几乎普遍称为多态,是一种类型 A 的能力,像其他类型一样出现和使用,< EM>乙
instanceof
类型比较运算符假设我们有以下内容:
class Mammal { void lactate(); }
class Dog extends Mammal { void bark(); }
class Cat extends Mammal { void meow(); }
然后您可以使用instanceof
类型比较运算符(§15.20.2)执行以下操作:
Mammal x = ...;
if (x instanceof Dog) {
Dog d = (Dog) x;
d.bark();
} else if (x instanceof Cat) {
Cat c = (Cat) x;
c.meow();
}
if (x != null) {
x.lactate();
}
如果没有if-else
,还有其他方法可以做到这一点。这只是一个简单的例子。
请注意,通过适当的设计,您可以避免某些类型的子类型差异化逻辑。例如,如果Mammal
采用makeSomeNoise()
方法,则只需拨打x.makeSomeNoise()
。
如果必须处理编译时未知的新类型,则可以使用反射。请注意,对于一般应用程序,几乎总有比反射更好的选择。