实现像多态继承一样

时间:2014-07-19 13:15:09

标签: java inheritance implements

背景和设置

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

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

我有三(3)个班级:

  1. ClassThatImplements
  2. ClassThatIsInterface
  3. ClassThatDoesSmthg
  4. 以下是他们的定义:

    界面

    Simpe的确如此:

    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期望作为其构造函数的一部分,类型为interface class ClassThatIsInterface;但是,发送给构造函数的是ClassThatImplements类型的对象,它实现ClassThatIsInterface

    显然,如果没有实现,new ClassThatDoesSmthg(this, appropriateVariable)语句将失败(生成错误)。对我来说有趣的是什么;但是,当一个类implements和一个interface实现类 - 在这种情况下 - 被认为是一个is-a ClassThatIsInterface(至少,它就是这样)。因此,声明成功了。

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

1 个答案:

答案 0 :(得分:1)

一般来说,有三种方法可以看待继承

  • 继承状态(类实例的内部表示)
  • 行为的继承(在这种情况下,方法及其实现)
  • 类型的继承(这是构成 is-a 关系的内容)

前两者紧密相连,甚至通常不单独考虑。

Java中用于帮助您实施这些类型继承的两个关键字是extendsimplements

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

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

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

  

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

总而言之,类实现接口的事实定义了两者之间的 is-a 关系。没有什么事情发生在幕后。

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