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
methodsprotected
,它将扩展到整个继承权
一种解决方法是重新实现类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();
}