为何是super.super.method(); Java中不容许?

我读了这个问题,并认为若是能够写的话,很容易解决(不是没有它就不能解决): html

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

我不肯定在不少状况下它是否有用,可是我想知道为何它没有用,以及其余语言中是否存在相似的东西。 java

大家有什么感想? api

编辑:澄清一下:是的,我知道,这在Java中是不可能的,我也不是很想念它。 这不是我指望的工做,而且惊讶于出现编译器错误。 我只有这个主意,喜欢讨论。 架构


#1楼

彷佛至少可使用反射来获取超类的超类的类,尽管不必定是它的实例。 若是这可能有用,请考虑Javadoc,网址为http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getSuperclass() 框架


#2楼

当架构是在表明几个派生类实现的通用CustomBaseClass中构建通用功能时,我曾遇到过相似状况。 可是,咱们须要针对特定​​派生类的特定方法规避通用逻辑。 在这种状况下,咱们必须使用super.super.methodX实现。 ide

咱们经过在CustomBaseClass中引入一个布尔成员来实现此目的,该布尔成员可用于有选择地推迟自定义实现并在须要时屈服于默认框架实现。 this

...
        FrameworkBaseClass (....) extends...
        {
           methodA(...){...}
           methodB(...){...}
        ...
           methodX(...)
        ...
           methodN(...){...}

        }
        /* CustomBaseClass overrides default framework functionality for benefit of several derived classes.*/
        CustomBaseClass(...) extends FrameworkBaseClass 
        {
        private boolean skipMethodX=false; 
        /* implement accessors isSkipMethodX() and setSkipMethodX(boolean)*/

           methodA(...){...}
           methodB(...){...}
        ...
           methodN(...){...}

           methodX(...){
                  if (isSkipMethodX()) {
                       setSKipMethodX(false);
                       super.methodX(...);
                       return;
                       }
                   ... //common method logic
            }
        }

        DerivedClass1(...) extends CustomBaseClass
        DerivedClass2(...) extends CustomBaseClass 
        ...
        DerivedClassN(...) extends CustomBaseClass...

        DerivedClassX(...) extends CustomBaseClass...
        {
           methodX(...){
                  super.setSKipMethodX(true);
                  super.methodX(...);
                       }
        }

可是,在框架和应用程序中遵循良好的架构原则,经过使用hasA方法而不是isA方法,咱们能够轻松避免此类状况。 可是在任什么时候候,指望设计良好的体系结构都不太可行,所以须要摆脱扎实的设计原则并引入相似的技巧。 只是个人2美分... spa


#3楼

@Jon Skeet很好的解释。 IMO若是有人要调用super.super方法,则必需要忽略直接父级的行为,但要访问大父级的行为。 这能够经过实例Of来实现。 以下代码 .net

public class A {
    protected void printClass() {
        System.out.println("In A Class");
    }
}

public class B extends A {

    @Override
    protected void printClass() {
        if (!(this instanceof C)) {
            System.out.println("In B Class");
        }
        super.printClass();
    }
}

public class C extends B {
    @Override
    protected void printClass() {
        System.out.println("In C Class");
        super.printClass();
    }
}

这是司机课, 设计

public class Driver {
    public static void main(String[] args) {
        C c = new C();
        c.printClass();
    }
}

此输出将是

In C Class
In A Class

在这种状况下,将忽略B类printClass行为。 我不肯定这是不是实现super.super的理想或良好作法,但仍然有效。


#4楼

若是可能的话,我会把super.super方法的主体放在另外一个方法中

class SuperSuperClass {
    public String toString() {
        return DescribeMe();
    }

    protected String DescribeMe() {
        return "I am super super";
    }
}

class SuperClass extends SuperSuperClass {
    public String toString() {
        return "I am super";
    }
}

class ChildClass extends SuperClass {
    public String toString() {
        return DescribeMe();
    }
}

或者,若是您不能更改super-super类,则能够尝试如下操做:

class SuperSuperClass {
    public String toString() {
        return "I am super super";
    }
}

class SuperClass extends SuperSuperClass {
    public String toString() {
        return DescribeMe(super.toString());
    }

    protected String DescribeMe(string fromSuper) {
        return "I am super";
    }
}

class ChildClass extends SuperClass {
    protected String DescribeMe(string fromSuper) {
        return fromSuper;
    }
}

在这两种状况下,

new ChildClass().toString();

结果为“我是超级超级”


#5楼

我认为这是一个破坏继承协议的问题。
经过扩展课程,您能够遵照/赞成其行为,功能
在调用super.super.method() ,您想打破本身的服从协议。

你不能从超级班上挑樱桃

可是,在某些状况下,您可能须要在代码中或在您继承的代码中调用super.super.method() -一般是一个错误的设计标志!
若是超级 超级超级类不能被重构(一些旧的代码),而后选择超过继承组成。

封装破坏是当您经过破坏封装的代码@Override一些方法时。 设计为不可覆盖的方法标记为final

相关文章
相关标签/搜索