【问题标题】:understanding Inheritance and Polymorphism理解继承和多态
【发布时间】:2012-01-13 02:04:20
【问题描述】:

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

我有一个类 A,它是超类。 BC 类扩展了 A 并且是子类。

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

类型转换是一种好的编程技术吗?如果不是,这里的多态性有什么用?

谢谢。

【问题讨论】:

  • 好处是代码重用和提供不同的行为。这就是为什么它被称为多态性。
  • 你的意思是在你的方法中,你想要一个 A 类型的对象(以及它的子类),但是如果该对象恰好是 类型B 您想访问特定于 B 的属性(即在 A 中不可用的属性)?
  • 没错,这就是我要找的
  • 您可能希望将访问者或策略模式作为检查类、强制转换和使用 if 语句来处理不同类的替代方案。

标签: inheritance polymorphism


【解决方案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)
  }
}

【讨论】:

  • 那么,如果我在参数上使用 instanceof 运算符,如果它是 B 类型,则将其类型转换为 B 是否很好?
  • 是的,这应该是安全的,但为了清晰/美观,最好使用单独的方法。
  • 如果我使用签名 B 创建一个不同的方法,那么无论我在哪里调用该方法,我都需要检查参数的类型并相应地调用该方法。那不是更复杂吗?
  • 不,语言会自动为您完成!这就是多态性的全部意义,您可以拥有具有相同标识符(名称)但不同签名(参数类型)的方法,并且自动调用正确的方法,即使一种类型包含另一种类型(选择较窄的类型) ! ... 至少,在任何适当的编程语言中都是这样。
  • 知道了。谢谢,但是如果我有两种方法,我不是在复制代码并在第二种方法中添加一些附加信息吗?
【解决方案2】:

我假设你想要类似的东西(伪代码):

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 中却很自然。

【讨论】:

  • 我正在使用java。我猜 Typecasting 是唯一的方法?同样,类型转换是一种好的编程技术吗?
  • 在 Java 中,类型转换是唯一的方法。风格是否好取决于用例。如果与思想一起使用并且很少使用,这没什么大不了的。但是,如果您注意到自己一遍又一遍地进行转换,您可能应该重新考虑您的类层次结构或如何以不同的方式(接口)抽象事物。
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多