首先,我知道旁边没有关于语言论,以及我几乎不认识任何其他语言除了Java,但我有一个想法,我觉得会很酷,但我需要你们告诉我:
a:为什么它很烂
b:如何语言x已经有了很多年了
c:怎么我的头脑很烂
d:上述所有的

这个想法得到组成的相同的便于重复使用这个代码 extends 不。

所以如果你有一个类似这样的:

public interface A {  
    public void methodInA();  
}

然后你有一个类似这样的:

public class B {  
    private composed A;
    public B() {
        // construct A within constructor
    }
}

你就可以做到这一点:

B myB = new B();
myB.methodInA();

没有必要添加在该代表团在B类。但你也可以做同样的继承,即:

@Overrides
public void methodInA(){
    // B's own delegation method
}

缺点包括:

  • 方法都是隐藏在来源代码,使它不那么明显这里的电话是来自何处,但也是这种情况与 extends
  • 如果由领域的共同签名方法需要有一个冲突得到解决(如何相互冲突的接口,解决这个问题?)
  • 如果你想要几个构成领域的相同类型,那里将是一个明显的冲突,这场的代表
  • 大概100其他事情我已经不想的

就像我说的,我很明显没有语言理论家,和我没有花年龄段的思考,这个想法只是突然出现在我的头和我想知道如何错了我。我只是认为这将是一种很酷。

有帮助吗?

解决方案

我想如果你受到限制,它使得一类,只能使用这一功能组成一个单一类,它就是有点有用的,并将避免许多的痛这是正在讨论之中。

我个人仇恨的继承的具体课程。我一个大大的拥护者项目14从布洛克的 有效的Java, 有利于组成了继承.我认为像这样的东西将使这一点更容易实现的惯用语,他建议在该项目。

老实说,如果你真的知道你在做什么我敢打赌你可以写一个编译器的注释,将处理这个问题。因此,假如你有一个类条,实施该接口的伊巴尔,你的课就是这样的:

public class Foo {

  @Delegate(IBar.class)
  private Bar bar;

  // initialize bar via constructor or setter
}

然后在汇编Foo可以作出执行伊巴尔及的任何方法上的接口,是不是已经实施的Foo将最终产生于这样的:

public Baz method1(Qux val) {
  return bar.method1(val);
}

如上所述你想让的限制,只有一个领域,每班可能使用此标注。如果多个领域有这个注解你可能会想扔一个编辑错误。或者你可以想出一个办法进行编码的某种优先型参数通过。

现在,我已经写出这似乎有点凉爽。也许我会播放它下个星期。我会更新这个如果我管理的图什么。

其他提示

这听起来很酷,但我认为它使用一些可怕的语言结构。显然有一个问题,如果声明超过一个的'组成的'同一类,但是即使你保佑那个怎么样的情况下,一个称匹配的方法在超过一项(不同)组成的课程?你就必须指定哪一个被称为主流,并且你将需要额外的语法。情况变得甚至更糟糕的是,如果有公共成员在该课程。

合成物是用来防止问题与多个继承。允许组成这样的是有效地允许多个继承,至少在条款的解决方法的呼吁。由于一个关键的设计决定用Java是不允许多个继承权(对于良好的原因),我认为这不可能的,这都不会被引入到Java。

我不知道,我看到一个明显的优势,这样做虽然。我了解你。的时刻到电话上的一个方法你必须myB.getAInstance().methodInA(),但你想让这myB.methodInA().

但是,会发生什么,如果你有多个实例?如何将该方法的呼吁可解决?很多次的组成意味着一个对许多协会所B有许多实例。然后会发生什么?

我同意你的缺点,列出。这可能只是导致太多的混淆,比它的价值。

检查出什么是所谓"混合"中的一些语言,以及"角色"在Perl5驼鹿OO系统。

还有之间的差异 组成聚集 考虑。如何编译器知道你是否意味着'是'或'具有-a'的关系?

  • 不全对象图有资格成为垃圾收集或只有头部的图?

一对夫妇的对象映射工具和框架过围绕它们提供 belongsTohas-many 之间的关系持久的对象并且一些还提供联删除(对于组合物)。我不知道的一个方面,提供简单的语法糖你在寻找的。

实际上,在第二个想法,时髦的元类和元编程语(s)可以提供的东西很相似,具有'auto-魔法'的代表团。

多个继承允许在C++的,我知道,不同,但它是沿着相同的思想过程。Java是设计成不允许多个继承所以,会有较少的混乱,因此错误和漏洞。

你有什么建议是在直接冲突的原则。

有的说,这将是很酷的(不一定是有用的)。我java程序员交换从C++。我喜欢能够让我自己的错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top