如何覆盖抽象属性?

问题描述 投票:-3回答:2
public abstract class SampleA
{
    public abstract string PropertyA {get;set;}
}

如何覆盖抽象属性?

enter image description here

c# oop abstract-class
2个回答
0
投票

当你覆盖你的属性时,你应该写getset。在您的情况下,您创建一个具有相同名称但具有另一个签名的新属性。


1
投票

您正尝试使用字段覆盖属性

属性提供getset值访问器对字段的访问。请阅读this以更好地了解其中的差异。因为它们不相同,所以IDE建议您使用new-Keyword隐藏父属性。

如果你想知道为什么new关键字在你的情况下不起作用,请阅读this

Improve your Design

在您的问题中,您的代码中的PropertyA似乎需要在继承的类上设置,但不能从外部更改。所以也许这样做:

public abstract class SampleA
{
    // no setter -> cant be changed after initialization
    public abstract string PropertyA { get; } 

    // protected setter -> can only be changed from inside SampleA or Sample
    public abstract string PropertyB { get; protected set; } 
}

public class Sample : SampleA
{
    public override string PropertyA { get; } = "override";
    public override string PropertyB { get; protected set; } = "override";
}

How it's done with your current design

像这样做:

public class Sample : SampleA
{
    public override string PropertyA { get; set; } = "override";
}

甚至用更多的行为实现它:

public class Sample : SampleA
{
    private string _propertyA = "override";

    public override string PropertyA
    {
        get { return _propertyA; }
        set
        {
            // Maybe do some checks here
            _propertyA = value;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.