c# - 部分覆盖子类中的虚拟自动属性

标签 c# inheritance theory

是时候回答我刚刚遇到的理论问题了。

下面的代码是有效的并且可以编译:

public class Parent
{
    public virtual object TestProperty { get; set; }
}

public class Child : Parent
{
    private string _testValue = "Hello World!";

    public override object TestProperty
    {
        get { return _testValue; }
    }
}

public class Consumer
{
    Parent p = new Child();

    public Consumer(){ p.TestProperty = 3; }
}

我的问题是:

为什么 C# 允许我在导致部分不可预测的行为时部分覆盖子项中的 TestProperty auto 属性?是否有实际应用?

我可以使用父类的 setter 设置 TestProperty 的值(我检查了正在生成的 IL,并且 setter 仍在父类中设置支持对象),即使公众无法访问该值。

最佳答案

此行为与 C# 中的非自动实现属性一致。始终可以只覆盖虚拟属性的 get 或 set 方法。因此,无法使用自动实现的属性会造成不必要的不​​一致。

例如下面是合法的

class A
{
    public virtual int P1
    {
        get { return 42; }
        set { }
    }
}

class B : A
{
    public override int P1
    {
        get { return 18; }
    }
}

关于c# - 部分覆盖子类中的虚拟自动属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3884025/

相关文章:

c# - 使用 vnext (ASP.NET 5 RC1 Update1) 在 Mac 中设置托管环境变量

java - 对非构造函数方法强制执行 super 调用

database - 使用签名树的生产应用程序的任何示例?

C++继承与构造函数、析构函数

php - Doctrine2 多级继承

python - 交叉验证网格搜索背后的理论

logic - 组合逻辑公理

c# - C# 中的枚举应该有自己的文件吗?

c# - 将 BindingSource.DataSource 声明为通用的

c# - 如何区分同名的局部变量和静态变量