我在C#语言规范中看到以下内容。
如果继承的属性包含两个访问器(即,如果继承的属性是读写),则覆盖属性可以包括单个访问器或两个访问器。
假设我想确保如果派生类重写虚拟属性,它同时具有getter和setter。有没有办法确保这一点,而不必将虚拟属性分成两个单独的属性?
答案 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"); }
}
}