怎么隐藏从父对象继承而来的功能,使其对继承对象隐藏

如何隐藏从父对象继承而来的功能,使其对继承对象隐藏?
比如有三个对象:a,b,c
b继承于a
c继承于b

a用Protected关键字提供了一个函数F,所以b是能使用这个函数F的,但b如何让c无法使用该函数?
------解决思路----------------------
虽然从OO的角度不建议这么做,不过有时候也没什么好办法,像winform里面Control的继承树上就有这样的东西。

在b上重定义一个新的F,c#是protected new void F(),vb.net是Protected Overloads Sub F(),一般这个方法里面就扔个NotSupportedException出来。c里面如果使用F,就是b上新定义的这个,调用就会扔异常。当然b自己要用F的时候要base.F()或者MyBase.F()。最好在新的F上再加一个EditorBrowsable(EditorBrowsableState.Never)的attribute。
------解决思路----------------------
用类的聚合代替继承关系。
------解决思路----------------------
引用:
Quote: 引用:

虽然从OO的角度不建议这么做,不过有时候也没什么好办法,像winform里面Control的继承树上就有这样的东西。

在b上重定义一个新的F,c#是protected new void F(),vb.net是Protected Overloads Sub F(),一般这个方法里面就扔个NotSupportedException出来。c里面如果使用F,就是b上新定义的这个,调用就会扔异常。当然b自己要用F的时候要base.F()或者MyBase.F()。最好在新的F上再加一个EditorBrowsable(EditorBrowsableState.Never)的attribute。


谢谢,如果我想让C完全看不到函数F呢?  可能吗?

正常情况应该做不到。我猜可以用cecil之类的工具把F的名字变成一个c#/vb.net不合法,但是IL合法的名字,那应该算看不到了,不过我没试过。而且用反射始终可以“看到”和调用的。这还不如用组合,做一个新的wrapper类,外观和b一样,但是没有F方法,里面组合一个b对象,所有方法都调用b的, 然后让c从wrapper继承。不过这样就不能把c当作a和b了,如果a上面还有个接口来定义外观,其它地方是依赖的接口而不是a就会好点,wrapper也实现那个接口就可以了。