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

C# 是否可以确保C虚拟属性在派生类中同时具有两个访问器?,c#,inheritance,properties,C#,Inheritance,Properties,我在C语言规范中看到了以下内容 如果继承的属性同时包含两个访问器(即,如果继承的属性是读写的),则重写属性可以包含单个访问器或两个访问器 假设我想确保,如果派生类重写虚拟属性,那么它同时具有getter和setter。有没有一种方法可以确保这一点,而不必将虚拟财产分成两个单独的部分 答案是否定的 大卫是对的。我认为,强迫您的子类重写虚拟财产违反了原则。基类的一个目的是提供可供子类使用的基类实现。如果你告诉你的孩子他们必须实现它,那么作为父母,你不应该提供一个基本的实现 若要强制子级重写成员,该成

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

如果继承的属性同时包含两个访问器(即,如果继承的属性是读写的),则重写属性可以包含单个访问器或两个访问器

假设我想确保,如果派生类重写虚拟属性,那么它同时具有getter和setter。有没有一种方法可以确保这一点,而不必将虚拟财产分成两个单独的部分

答案是否定的

大卫是对的。我认为,强迫您的子类重写虚拟财产违反了原则。基类的一个目的是提供可供子类使用的基类实现。如果你告诉你的孩子他们必须实现它,那么作为父母,你不应该提供一个基本的实现

若要强制子级重写成员,该成员必须是抽象的

在本例中,基类提供了一个默认实现:

// 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
{}
在本例中,基类强制子类通过不提供他自己的抽象类来实现成员

编译错误:“绿巨人”未实现继承的抽象成员“Avenger.myIdentity.get”

但在约翰看来,父母无法控制孩子的行为。 这包括:

// 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"); }
    }
}

我认为确保某些内容被覆盖的唯一方法是将其抽象化,而不是虚拟化。或者将其包含在接口中。virtual提供了一个默认实现,允许重写,但不需要。感谢David,我试图澄清我的问题,我想确保如果重写了属性,那么getter和setter都会被重写。不过,这仍然不会改变virtual的工作方式。了解getter和setter是类上的两个不同方法。两者都是独立虚拟的。继承类可以重写一个、两个或两个。我不认为语言本身有一种机制,可以在重写其他内容的基础上有条件地强制执行是否需要重写。您可能需要在父类中进行一些反射,以尝试查看它是否能够从父类中看到哪些被重写,哪些没有被重写,并在运行时引发异常。这也不会改变这样一个事实,即派生类如何重写属性与您无关。派生类一般不属于您。是的,我接受David的答案,因为我认为这里需要反射。
// 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"); }
    }
}