是否有可能确保C#虚拟属性在派生类中同时具有两个访问器?

时间:2015-04-08 01:28:42

标签: c# inheritance properties

我在C#语言规范中看到以下内容。

  

如果继承的属性包含两个访问器(即,如果继承的属性是读写),则覆盖属性可以包括单个访问器或两个访问器。

假设我想确保如果派生类重写虚拟属性,它同时具有getter和setter。有没有办法确保这一点,而不必将虚拟属性分成两个单独的属性?

1 个答案:

答案 0 :(得分:0)

答案是否定的。

大卫是对的。我认为强迫您的子类覆盖虚拟财产违反了OOP原则。基类的一个目的是提供可供子类使用的基本实现。如果您告诉您的孩子他们必须实施它,那么您作为父母不应该提供基本实施(明显的家庭并行意图)。

要强制您的孩子覆盖该成员,它必须是 abstract

在此示例中,基类提供默认实现:

// Base Abstract Class
public abstract class Avenger
{
    public virtual string MyVehicle
    {
        get
        {
            if (MyVehicle == null)  // Default the value if it is null
                MyVehicle = "Quinjet";  
            return MyVehicle;
        }
        set; // Allow the child class to set their own vehicle
    }
}

// Derrived class piggy-backs off of the parent's implementation
public class Hulk : Avenger
{}

在此示例中,基类强制子类通过不提供自己的一个(使用 abstract )来实现该成员

// Base Abstract Class
public abstract class Avenger
{
    public abstract string MyIdentity { get; }
}

// Not implementing MyIdentity results in compile error
public class Hulk : Avenger
{ }

编译错误:'绿巨人'没有实现继承的抽象成员' Avenger.myIdentity.get'

但是对于 John 点,父母无法控制孩子的行为。 这编译:

// Base Abstract Class
public abstract class Avenger
{
    public abstract string MyIdentity { get; }
}

// Derrived class implements abstract member
public class Hulk : Avenger
{
    public override string MyIdentity
    {
        get { throw new NotImplementedException("Won't tell"); }
    }
}