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
方法,抛出适当的 运行 时间异常。但是你不能强制编译时失败。
(请注意,您可以使用 friend
ships 在 C++ 中实现您想要的:您可以在 class A
中标记方法 private
并使 class B
class A
的 friend
个。)
此刻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();
}
我知道
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
方法,抛出适当的 运行 时间异常。但是你不能强制编译时失败。
(请注意,您可以使用 friend
ships 在 C++ 中实现您想要的:您可以在 class A
中标记方法 private
并使 class B
class A
的 friend
个。)
此刻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();
}