理解继承与多态

时间:2012-01-13 02:04:20

标签: inheritance polymorphism

我的问题是关于继承和多态性。

我有一个班级 A ,这是超级班级。类 B C 扩展 A 并且是子类。

现在我在其他类(非A或B或C)中有一个函数,它接受 A 类型的参数。因此,多态性允许我们将参数作为 A B C 传递给该函数。现在在该函数中,为了访问 B 的属性,我必须将收到的参数强制转换为 B

类型转换是一种很好的编程技术吗?如果没有,那么多态的用途是什么?

感谢。

2 个答案:

答案 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中它很自然。