to:s5689412(华君) 是以下这种情况: c1是很多类的基类,比如c2,c3,c4都继承自c1. c1.f1()在大多数派生类中都是public的。但如果c2不希望公开f1(),那就需要禁止基类的f1方法了to:JasonHeung(拥有一切不过就这样笑着哭) 采用这种写法,还是可以调用c2.f1()的,此时实际上是调用了基类的f1()。实际上写成public new f1()倒是覆盖了基类的f1了,但当将c2显式转换成c1时,即((c1)c2).f1时,又调用了c1.f1了。还有就是写成虚函数了,但除此之外呢?
to: tiaoci(我挑刺,我快乐) 似乎的确如此。
to: builder666666(nj) 但继承也会有特例啊,这也是很自然的现象。派生类继承了基类的绝大部分特性,但禁用某些基类的特性也该是合理的,否则的话,只能把基类的特性范围缩小,再为特性差异不大的对象建立不同了派生类了.
你的想法虽然没有错,但是你的类的概念是错的,其实要做到这一点你需要对类的设计作一些变动,比如说在抽取一个基类出来: 原来的设计: pubic class A { public void Foo(); public void Boo(); }public class B : A { ... }新的设计:(假设你要禁止的是Boo方法)public class AB { public void Foo(); }public class A : AB { public void Boo(); }public class B : AB { ... }
你是方便了,但是你想过用你类库的其他人? 首先,你必须告诉他们你的派生了禁用了基类的哪些方法; 其次,如果有人想从你的派生类再派生,他们需要启用基类的方法,怎么办呢? 因为C#只可以单继承,你总不是像说,从你的类派生的类允许返祖吧?即便你允许如此,那么这个类的层次是不是也是怪怪的? class C { public void F1(); public void F2(); }class C1 : C { public void F1(); forbid void F2(); }public C2 : C1 { ... //what about the F2 ? }
{
}
JackWu (JackWu) 能不能说详细点,你想如何禁用?
是以下这种情况:
c1是很多类的基类,比如c2,c3,c4都继承自c1. c1.f1()在大多数派生类中都是public的。但如果c2不希望公开f1(),那就需要禁止基类的f1方法了to:JasonHeung(拥有一切不过就这样笑着哭)
采用这种写法,还是可以调用c2.f1()的,此时实际上是调用了基类的f1()。实际上写成public new f1()倒是覆盖了基类的f1了,但当将c2显式转换成c1时,即((c1)c2).f1时,又调用了c1.f1了。还有就是写成虚函数了,但除此之外呢?
似乎的确如此。
但继承也会有特例啊,这也是很自然的现象。派生类继承了基类的绝大部分特性,但禁用某些基类的特性也该是合理的,否则的话,只能把基类的特性范围缩小,再为特性差异不大的对象建立不同了派生类了.
原来的设计:
pubic class A
{
public void Foo();
public void Boo();
}public class B : A
{
...
}新的设计:(假设你要禁止的是Boo方法)public class AB
{
public void Foo();
}public class A : AB
{
public void Boo();
}public class B : AB
{
...
}
我也知道这样做,“只能把基类的特性范围缩小,再为特性差异不大的对象建立不同了派生类了.”只是觉得不方便。我觉得要是能禁用基类的方法,可以减少继承的层次。比如:有方法f1...f10,如果有3个子类,分别不用f8,f9,f10方法,共用其它方法,就得如下设计:
基类c1(f1...f7),
c2:c1(f9,f10),
c3:c1(f8,f10),
c4:c1(f8,f9)
这样就得分别维护3个子类中的f8,f9,f10。当改动了f8-10之一的方法,就得同修改别的类,比如改了f8方法,就得维护c3,c4。而如果可以禁用的话,只需
c1(f1...f10)
c2:c1( forbid f8)
c3:c1( forbid f9)
c4:c1( forbid f10)
这样会更自然
class C
{ public void F1(); public void F2(); }class C1 : C
{ public void F1(); forbid void F2(); }public C2 : C1
{
... //what about the F2 ?
}