【问题标题】:Implements Behaving Like Polymorphic Inheritance实现行为类似于多态继承
【发布时间】:2014-07-19 13:15:09
【问题描述】:

背景和设置

好的,让我们看看我能否让这个问题“有意义”。以下代码示例旨在传达原则并反映代码背后的思想。如果您对详细代码感兴趣,可以找到代码here

我已经阅读了基础知识,咨询了Java Tutorials(这是一个很棒的资源)、好的 ol' Dietel 和文档。澄清一下:我是初学者。

我有三 (3) 个课程:

  1. ClassThatImplements
  2. ClassThatIsInterface
  3. ClassThatDoesSmthg

以下是它们的定义:

界面

真的很简单:

public interface ClassThatIsInterface {
    public void doSomething(type variable);
}

实现接口的类

public class ClassThatImplents implements ClassThatIsInterface {

    // Here's the bit I hope to ask about, pt. 1 of 2:

    ClassThatDoesSmthg instance = new ClassThatDoesSmthg(this, 
                                                appropriateVariable);
}

做某事的类

public class ClassThatDoesSmthg {

    // And the second bit, pt. 2 of 2: 

    public ClassThatDoesSmthg (ClassThatIsInterface variableOne, 
                                               type appropriateVariable) {

    }

问题

上面的代码片段应该给你足够的信息来回答这个问题,我想。

确实,问题的重点是后两个类:ClassThatImplementsClassThatDoesSmthg

ClassThatDoesSmthg 期望将interfaceClassThatIsInterface 类型的对象作为其构造函数的一部分;然而,发送到构造函数的是一个类型为ClassThatImplements 的对象,它实现了ClassThatIsInterface

显然,如果没有实现,new ClassThatDoesSmthg(this, appropriateVariable) 语句将失败(产生错误)。我感兴趣的是什么;然而,当一个类 implementsinterface 时,实现类 - 在这种情况下 - 被认为是一个 is-a ClassThatIsInterface (至少,它是这样出现的)。因此,该语句成功。

所以,这是我的问题:从概念上讲,ClassThatImplements 发生了什么事到它被识别为ClassThatIsInterface 类型的地方?

【问题讨论】:

  • 简单来说,Java中有两个“is-a”关系; extendsimplements.
  • 没有什么“发生”,它简单的“is-a”正是因为它实现了那个接口。
  • 谢谢,我想答案很简单。我只是希望发生一些更有趣的事情,我猜。

标签: java inheritance implements


【解决方案1】:

一般来说,您可以通过三种方式看待继承

  • 状态的继承(类实例的内部表示)
  • 行为的继承(在本例中为方法及其实现)
  • 类型的继承(这是构成 is-a 关系的原因)

前两者紧密联系在一起,通常甚至不单独考虑。

Java 中有助于强制执行这些类型继承的两个关键字是extendsimplements

前者只允许单行继承,通过使用它,您可以创建上述所有三种类型的继承关系。

另一方面,后者允许您使用多重继承,但仅限于类型的继承。状态和行为的多重继承在 Java 中是不可能的,应该使用组合来实现类似的效果。

这基本上就是 Java 被设计成一门语言的方式。如果您查看其他(或多或少)面向对象的语言,您可以看到其他方法。 C++ 在所有三个方面都支持多重继承(IMO 并不是一件好事)。 Ruby 允许您通过使用 mixins 来处理行为的继承,此外,由于该语言支持 duck typing,因此对类型的强制执行关注较少。

所以,这是我的问题:从概念上讲,发生了什么 ClassThatImplements 到它被识别为类型的位置 ClassThatIsInterface?

总而言之,类单独实现接口这一事实定义了两者之间的is-a关系。引擎盖下没有更多的事情发生。

您可以在Java Language Specification 中查看子类型的确切规则。在你的情况下,这很简单。当您查看泛型类时,它会变得更加有趣。不过,这不是最令人愉快的阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多