【问题标题】:C# inheritanceC# 继承
【发布时间】:2010-11-05 02:07:55
【问题描述】:

假设我有以下代码:

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() 的方法并且可以调用(它不会覆盖抽象类中具有相同名称的方法,因为它没有标记为虚拟),但我想切断在SomeImpl类中实现这种方法的可能性。

这可能吗?

【问题讨论】:

    标签: c# inheritance interface abstract-class


    【解决方案1】:

    在处理接口和抽象类时,更多的是关于你必须做什么而不是你不能做什么。因此,您可以让界面用户知道这些是他们必须实现的方法,并且对于您的抽象类,您可以使用 virtual 关键字让他们知道可以覆盖方法。但是,您不能阻止他们做太多事情。即使您故意不使用 virtual 关键字,他们仍然可以使用 new 关键字将其隐藏。

    【讨论】:

      【解决方案2】:

      如果 SomeImpl 类包含 DoSemthing 方法,这意味着它隐藏了原始的不覆盖。

      【讨论】:

        【解决方案3】:

        没有标记为virtual的方法默认是密封的。在派生类中,您必须使用关键字 new 标记“覆盖”方法,否则您将收到编译器警告。 如果超类的方法被标记为虚拟,您可以按sealed override对其进行封装。

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

        【讨论】:

          【解决方案4】:

          默认情况下所有方法都是密封的,但无法阻止成员隐藏。

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

          【讨论】:

          • 如果你不小心做了,它只会发出警告;添加“新”限定符,它会关闭......
          【解决方案5】:

          默认情况下,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");            
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2015-04-19
            • 2012-10-30
            • 2023-04-06
            • 2016-03-02
            • 1970-01-01
            • 2017-03-31
            • 2012-02-13
            • 2015-12-09
            • 1970-01-01
            相关资源
            最近更新 更多