为什么是super.super.method(); Java中不允许

问题:

我读了this question,认为很容易解决(不是没有可以解决)如果可以写:

@Override
public String toString() {
    return super.super.toString();
}

我不知道在许多情况下是否有用,但是我不知道why它不是,如果这样的东西存在于其他语言。
你们有什么感想?
 编辑:
澄清:是的,我知道,这是不可能的Java,我不是真的想念它。这是没有什么我期望的工作,并惊讶得到编译器错误。我只是想出了这个想法,并且喜欢讨论它。

回答:

它违反封装。您不应该能够绕过父类的行为。有时可以绕过你的own类的行为(特别是在同一个方法中),而不是你的父母。例如,假设我们有一个基础“项目集合”,一个代表“红色项目的集合”的子类,以及代表“大红色项目的集合”的子类。有理由有:

public class Items
{
    public void add(Item item) { ... }
}

public class RedItems extends Items
{
    @Override
    public void add(Item item)
    {
        if (!item.isRed())
        {
            throw new NotRedItemException();
        }
        super.add(item);
    }
}

public class BigRedItems extends RedItems
{
    @Override
    public void add(Item item)
    {
        if (!item.isBig())
        {
            throw new NotBigItemException();
        }
        super.add(item);
    }
}

很好 – RedItems可以随时确信它包含的项目都是红色的。现在假设我们were能够调用super.super.add():

public class NaughtyItems extends RedItems
{
    @Override
    public void add(Item item)
    {
        // I don't care if it's red or not. Take that, RedItems!
        super.super.add(item);
    }
}

现在我们可以添加我们喜欢的任何东西,RedItems中的不变量是坏的。
那有意义吗?

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why is super.super.method(); not allowed in Java?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 84 = 94