【问题标题】:Re-abstracting overriden method重新抽象重写方法
【发布时间】:2013-10-24 14:48:03
【问题描述】:

我们看看下面的类结构:

abstract class Base {

    public abstract void DoSth();
}

class Derived1 : Base {

    public override void DoSth() {

    }
}

这些是某些层次结构的基类。现在,假设我们想要提供另一个派生自Derived1 的类(我们称之为Derived2),它不应该使用Default1 提供的DoSth 的默认实现。例如,Derived1 涵盖了 98% 的情况,但在剩下的 2% 中,这种解决方案是不可接受的或危险的。

最好的解决方案是通知派生自 Derived2 的人,他应该在编译期间实现 DoSth。该怎么做?

【问题讨论】:

    标签: c# methods virtual abstract class-hierarchy


    【解决方案1】:

    C# 允许“重新抽象”该方法。可以写:

    abstract class Derived2 : Derived1 {
    
        public abstract override void DoSth();
    }
    

    从现在开始,DoSth 再次变为抽象,如果它不提供自己的 DoSth 实现,编译器将拒绝编译派生自 Derived2 的类。

    【讨论】:

    • 答案与问题的发布时间同时?!!
    • @AhmedKRAIEM 没关系。事实上,当您提出问题时,甚至还有一个“回答您自己的问题”的特定选项。试试看 - 点击“提问”并查看页面底部附近。
    • @MatthewWatson,对不起,我不知道。 (而且我在 SO 上工作了 3 年多)。
    • @AhmedKRAIEM,虽然回答你自己的问题很好,但不能发布重复的问题 :) 投票结束...
    • @DavidArno 这并不是真的重复,因为这两个问题几乎可以相互回答。
    【解决方案2】:

    我能想到的最好方法是:

    class Derived1 : Base
    {
    
       public override void DoSth()
       {
    
       }
    }
    
    abstract class Derived2 : Derived1
    {
       public virtual new void DoSth()
       {
    
       }
    
    }
    

    【讨论】:

    • -1 有更好的方法。它已经作为答案存在。跟踪几乎从来都不是一个好主意。
    • 真的???...嗯,好吧,我猜 msdn 说它在派生类中实现自己的默认行为是错误的......“几乎从不”并不意味着每次...... .
    • 那也解决不了问题。来自Derived2 的人不会轻易知道,他必须覆盖DoSth
    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2021-03-13
    • 2011-12-26
    相关资源
    最近更新 更多