我的问题是关于继承和多态性。
我有一个班级 A ,这是超级班级。类 B 和 C 扩展 A 并且是子类。
现在我在其他类(非A或B或C)中有一个函数,它接受 A 类型的参数。因此,多态性允许我们将参数作为 A , B 或 C 传递给该函数。现在在该函数中,为了访问 B 的属性,我必须将收到的参数强制转换为 B 。
类型转换是一种很好的编程技术吗?如果没有,那么多态的用途是什么?
感谢。
答案 0 :(得分:1)
类型转换仅在您知道要投入的内容时才有用。
这里多态的使用是其他类中的方法可以用通用的方式编写,因此单个代码可以在不同的类型上运行,但是它们有一些共同的接口(类A)
所以......类型转换(取决于语言文化)是一种非常糟糕的做法。首选使用多态(取决于...),例如使用签名->(B)
创建不同的方法,并使用类型B的参数。
更新:添加了Java伪代码
class A { int m() {} }
class B extends A { int b() {} }
class C extends A {}
class $ {
static void x(A $$) {}
static void x(B $$) {}
}
public class P {
public static void main(String[] a) {
$.x(new A()); //calls $::x(A)
$.x(new B()); //calls $::x(B)
}
}
答案 1 :(得分:0)
我假设你想要那样的东西(伪代码):
void foo(A obj) {
if (obj.isOfClass(B)) {
// Access a property that B has, but A doesn't.
}
}
在这种情况下,您需要进行类型转换:
void foo(A obj) {
if (obj.isOfClass(B)) {
((B)obj).propertyOfB();
}
}
根据语言的不同,还有另一种方法。在Ruby和Objective-C等语言中,经常使用所谓的duck typing,而不是检查对象是否属于特定类型。这个想法是:如果它像鸭子一样走路,像鸭子一样嘎嘎叫它一定是鸭子。换句话说,对象的 type 是不是很重要,但是它是否实现了某些方法:
void foo(Object obj) {
if (obj.hasMethod(quack)) {
obj.quack();
}
}
经常使用鸭子打字的语言通常更具“动态”性质。例如,在C ++中使用非常严格的类型系统,几乎不可能进行鸭子打字(AFAIK),而在前面提到的Ruby和Objective-C中它很自然。