代码之家  ›  专栏  ›  技术社区  ›  Andrei

C#继承

  •  5
  • Andrei  · 技术社区  · 17 年前

    假设我有以下代码:

    interface ISomeInterface
    {
        void DoSomething();
        void A();
        void B();    
    }
    
    public abstract class ASomeAbstractImpl : ISomeInterface
    {
        public abstract void A();
        public abstract void B();
        public void DoSomething()
        {
            // code here
        }
    }
    
    public class SomeImpl : ASomeAbstractImpl 
    {
        public override void A()
        {
            // code
        }
    
        public override void B()
        {
            // code
        }
    }
    

    ASomeAbstractImpl.DoSomething() SomeImpl 可以调用一个方法 DoSomething()

    5 回复  |  直到 17 年前
        1
  •  9
  •   Marc Gravell    17 年前

    C#中的方法默认是密封的。然而, 防止方法隐藏(在派生类中公开同名方法,通常使用 new ).

    或者,就此而言,重新实现接口:

    static void Main()
    {
        ISomeInterface si = new EvilClass();
        si.DoSomething(); // mwahahah
    }
    
    public class EvilClass : ASomeAbstractImpl, ISomeInterface
    {
        public override void A() {}
        public override void B() { }
        void ISomeInterface.DoSomething()
        {
            Console.WriteLine("mwahahah");            
        }
    }
    
        2
  •  2
  •   Mark Seemann    17 年前

    每当您隐藏成员时,C#编译器都会发出编译器警告,但除此之外,您无法阻止它。

        3
  •  0
  •   Enyra    17 年前

    未标记为的方法 虚拟 默认情况下是密封的。在派生类中,你必须用关键字标记一个“重写”方法 新 ,否则您将收到编译器警告。 如果超类的方法标记为virtual,则可以按照 密封超控 .

    http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

        4
  •  0
  •   Ahmed    17 年前

    如果SomeImpl类包含DoSemthing方法,这意味着它隐藏了未重写的原始方法。

        5
  •  0
  •   Mark    17 年前

    虚拟 关键字,让他们知道可以重写方法。但是你不能阻止他们做太多。即使你故意不使用 虚拟 他们仍然可以用关键字隐藏它 新 关键字。