java中的受限继承

java中的受限继承,java,inheritance,multiple-inheritance,Java,Inheritance,Multiple Inheritance,我知道 class A { } class B extends A { } class C extends B { } 是完全合法的,我可以 C obj = new C(); obj.anyMethodfromA(); 这是可能的。 现在的问题是,如果我不想访问类C中的类A方法,那么应该只继承类B方法。 这可能吗 C anotherObj = new C(); anotherObj.anyMethodfromA(); //can be illegal? anotherObj.any

我知道

class A  { } 
class B extends A  { }  
class C extends B { }
是完全合法的,我可以

C obj = new C();
obj.anyMethodfromA();
这是可能的。 现在的问题是,如果我不想访问类C中的类A方法,那么应该只继承类B方法。 这可能吗

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

您不能从
classC
中删除
classA
方法,您所能做的就是重写classC中的classA方法并抛出。像


Java中没有这种细粒度继承。一旦您标记了
A
methods
protected
,它将扩展到整个继承权

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

(注意,在C++中,你可以用<代码>朋友< /COD>船舶实现你想要的东西:你可以在类<代码> >代码< >代码< >代码< >代码> B<代码>代码< <代码>朋友> <代码> A< <代码>

< P>在C一瞬间,但是听起来你不想要这个。所以,与其说是cb或者ba


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

您可以使用
interface
来隐藏
方法froma
,但实际上无法将其删除

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();
}

只有当
B
没有扩展
A
时,才有可能。虽然您可以在
C
中重写
A
的方法,并让它们抛出
UnsupportedOperationException
,但这不会使它们在编译时调用成为非法的。有什么逻辑原因吗?为什么要这样做?对不起,你有C是a。如果不是这样的话,那就不要这样做。旁注:我建议的解决方案这是一个糟糕的想法。如果你曾经这样做过,你就应该得到它将给你带来的痛苦和恐惧。@user137124同样,最好的例子是阅读文档,你会理解它的目的。但正如mlk所说,你为什么想要这个?这会引发运行时异常。因此,当您的方法引发此异常时,请小心,并添加相关的javadoc,以便api用户能够获得有关您的api的完整信息。@mik是的,如果OP同意更改其数据模型设计,这应该是更好的解决方案。
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();
}