【问题标题】:Require a property to be overridden when inheriting from a non-abstract class从非抽象类继承时需要覆盖属性
【发布时间】:2018-10-31 18:42:06
【问题描述】:

当基类不是抽象类时,有没有办法要求在派生类中重写属性?例如:

public abstract class BaseClass
{
    protected abstract string Test {get;}
}

internal class FirstClass : BaseClass
{
    protected override string Test => "First Class";
    // Methods common to FirstClass and SecondClass
}

internal class SecondClass : FirstClass
{
    protected override string Test => "Second Class"
}

如果任何类继承自FirstClass,是否有办法强制覆盖FirstClass 中的属性test

实际需要(可能不是很大)是在记录信息时,我们希望记录错误来源(类名等),因此我们希望强制所有叶派生类覆盖某些属性。

【问题讨论】:

  • 因为它是一个现有的代码库,而且 FirstClass 已经有许多可供 SecondClass 重用的方法。此外,将这些常用方法移至基类也不是一个好习惯,因为从基类继承的其他类不需要这些方法...
  • 如果您想要记录类名,那么为什么不简单地让您的记录代码调用this.GetType().Name 呢?
  • 故事很长,但故事很短,因为遗留代码的设计方式是我们无法做到的:(。

标签: c# inheritance


【解决方案1】:

当基类不是抽象的时候,有没有办法要求在派生类中重写一个属性?

(最初的问题是关于字段的。字段可能根本不会被覆盖;您的意思是“属性”,而不是“字段”。)

没有。

派生类是否选择覆盖是由派生类的作者决定的实现细节,他比基类的作者更了解该类的业务领域。

使必须被覆盖的成员的唯一方法是使其抽象。

用摘要覆盖是合法的。这将是合法的,例如:

abstract class BaseClass
{
    protected virtual string Test => "Base";
}
abstract class FirstClass : BaseClass
{
    // override abstract is slightly unusual but legal
    protected override abstract string Test { get; }
    // Concrete derived classes must override
}
class SecondClass : FirstClass
{
    protected override string Test => "Second Class"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多