java 中的受限继承

Restricted inheritance in java

我知道

class A  { } 
class B extends A  { }  
class C extends B { }

完全合法,我可以

C obj = new C();
obj.anyMethodfromA();

有可能。 现在的问题是,如果我不想访问 class C 中的 class A 方法怎么办 class B 方法应该被继承。 这可能吗?

C anotherObj = new C();
anotherObj.anyMethodfromA(); //can be illegal?
anotherObj.anyMethodfromB(); //should be legal.

你不能从classC中删除classA方法,你所能做的就是覆盖classC中的classA方法并抛出UnsupportedOperationException。喜欢

class C extends B { 

    @override
    public void someMethodWasInClassA() {
        throw new UnsupportedOperationException("Meaningful message");
    }

}

Java中没有这种细粒度的继承。一旦你标记了 A 方法 protected,它就会向下延伸到整个层次结构。

一种解决方法是在 class C 中重新实现 class A 方法,抛出适当的 运行 时间异常。但是你不能强制编译时失败。

(请注意,您可以使用 friendships 在 C++ 中实现您想要的:您可以在 class A 中标记方法 private 并使 class B class Afriend 个。)

此刻Cis-a A, however it sounds like you don't want that. So rather than have that maybe C has-a B or B has-aA.

Prefer composition over inheritance.

无法限制某些子class的访问。除了继承之外,您还可以使用接口来向特定 class 添加某些功能。

您可以使用一些技巧使用 interface 来隐藏 methodFromA 但实际上您无法将其删除。

class A {

    public void methodFromA() {
        System.out.println("methodFromA");
    }
}

class B extends A {

    public void methodFromB() {
        System.out.println("methodFromB");
    }
}

class C extends B {
}

interface D {

    public void methodFromB();

}

class E extends B implements D {

}

public void test() {
    // Your stuff.
    C obj = new C();
    obj.methodFromA();
    // Make a D
    D d = new E();
    d.methodFromB();
    // Not allowed.
    d.methodFromA();
    // Can get around it.
    E e = (E) d;
    e.methodFromA();
}