比如c1是基类,c2继承自c1,c1中有公共函数f1(),那在c2中如何禁用该函数呢?

解决方案 »

  1.   

    private new void f1()
    {
    }
      

  2.   

    禁用?不能用Private吗?
    JackWu (JackWu) 能不能说详细点,你想如何禁用?
      

  3.   

    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了。还有就是写成虚函数了,但除此之外呢?
      

  4.   

    to: tiaoci(我挑刺,我快乐)
    似乎的确如此。
      

  5.   

    to: builder666666(nj) 
    但继承也会有特例啊,这也是很自然的现象。派生类继承了基类的绝大部分特性,但禁用某些基类的特性也该是合理的,否则的话,只能把基类的特性范围缩小,再为特性差异不大的对象建立不同了派生类了.
      

  6.   

    你的想法虽然没有错,但是你的类的概念是错的,其实要做到这一点你需要对类的设计作一些变动,比如说在抽取一个基类出来:
    原来的设计:
    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
    {
       ...
    }
      

  7.   

    基类里设置flag。方法中判断flag执行方法功能。继承类重设flag,禁止方法执行。这样可以禁止基类操作的执行。不过禁止不了对方法的调用。
      

  8.   

    to:niwalker() 
    我也知道这样做,“只能把基类的特性范围缩小,再为特性差异不大的对象建立不同了派生类了.”只是觉得不方便。我觉得要是能禁用基类的方法,可以减少继承的层次。比如:有方法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)
    这样会更自然
      

  9.   

    你是方便了,但是你想过用你类库的其他人? 首先,你必须告诉他们你的派生了禁用了基类的哪些方法; 其次,如果有人想从你的派生类再派生,他们需要启用基类的方法,怎么办呢? 因为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 ?
    }