覆盖获取,但未设置

Gra*_*ton 75 c#

我有一个定义a的抽象类get,但不是set,因为就抽象类而言,它只需要一个get.

public abstract BaseClass
{
  public abstract double MyPop
  {get;}
}
Run Code Online (Sandbox Code Playgroud)

但是,在某些派生类中,我需要一个set属性,所以我正在研究这个实现

public class DClass: BaseClass
{
  public override double MyPop
  {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

问题是,我有一个编译错误,说

*.set:无法覆盖,因为*.没有可覆盖的set访问器.

即使我认为上述语法完全合法.

有什么想法吗?解决方法,或者为什么会这样?

编辑:我能想到的唯一方法是将两个getsetas放在抽象类中,让子类抛出一个NotImplementedExceptionif set被调用而且没有必要.这是我不喜欢的东西,还有一个特殊的setter方法.

Dav*_*d M 25

一个可能的答案是覆盖getter,然后实现一个单独的setter方法.如果您不希望在基础中定义属性设置器,则没有许多其他选项.

public override double MyPop
{
    get { return _myPop; }
}

public void SetMyPop(double value)
{
    _myPop = value;
}
Run Code Online (Sandbox Code Playgroud)


Lau*_*ble 17

你不可能做你想做的事.您必须在abstract属性中定义setter,否则您将无法正确覆盖它.

我知道定义getter和getter/setter的唯一情况是使用一个接口:

public interface IBaseInterface
{
    double MyPop { get; }
}

public class DClass : IBaseInterface
{
    public double MyPop { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 不错的做法; 但有时你只需要使用抽象类,而不是接口. (12认同)

Bri*_*ian 12

C#6.0中的新功能:

如果您只是在构造函数中调用setter,则可以使用只读属性解决此问题.

void Main()
{
    BaseClass demo = new DClass(3.6);
}

public abstract class BaseClass
{
    public abstract double MyPop{ get; }
}

public class DClass : BaseClass
{
    public override double MyPop { get; }
    public DClass(double myPop) { MyPop = myPop;}
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是真的,但它也不是一个很好的通用解决方案。当然,在很多情况下需要公共二传手。 (5认同)

her*_*ter 8

如果BaseClass在您自己的代码库中,那么您可以这样做:

abstract public class BaseClass
{
    abstract public double MyPop { get; protected set; }
}

public class DClass : BaseClass
{
    private double _myProp;
    public override double MyProp
    {
        get { return _myProp; }
        protected set { _myProp = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:然后你可以在DClass SetMyProp(double myProp)等中创建一个公共方法.域模型的类设计应该清楚或说明为什么不能直接在基类中设置属性以及为什么可以在派生类中设置属性.


mat*_*mes 5

如果你找到了办法,你确定做你想做的事情会是一个好的设计吗?

它将允许子类的对象进行父类对象无法进行的状态更改.这不会违反Liskov替代原则吗?