0

如果这是菜鸟问题,请向我道歉。
我有以下抽象基类:

public abstract class MockDataBase
{
  public virtual string ExternalId { get; set; }

我有派生类:

public class UnitMockDataBase: MockDataBase
{
 public override string ExternalId { set { ExternalId = value; } }

这会引发堆栈溢出。
如果我希望基类具有属性:

public virtual string ExternalId { get; private/protected set; }  

和派生类来覆盖它的设置器,我如何实现它?基类不能有外部 id,只有一些派生类使用它并且需要覆盖。

谢谢

4

2 回答 2

2

这会引发堆栈溢出。

public override string ExternalId { set { ExternalId = value; } }

因为您将进入无限循环,试图在 setter 中设置属性。如果您要实现自定义设置器,那么您应该摆脱自动实现的属性,定义一个字段并通过您的属性封装它。

对于另一个问题

基类不能有外部 id,只有一些派生类使用它并且需要覆盖。

这就是您保护访问说明符的原因。你可以protected像这样拥有它:

public abstract class MockDataBase
{
    private string _ExxternalID;

    public virtual string ExxternalID
    {
        get { return _ExxternalID; }
        protected set { _ExxternalID = value; }
    }
}
public class UnitMockDataBase : MockDataBase
{
    public override string ExxternalID
    {
        get
        {
            return base.ExxternalID;
        }
        protected set
        {
            base.ExxternalID = value;
        }
    }
}
于 2013-04-25T07:01:54.530 回答
1

您正在set无限循环中调用。要解决此问题,请像这样更改您的代码:

public class UnitMockDataBase: MockDataBase
{
    private string _externalId;
    public override string ExternalId 
    {
        get { return _externalId; } } 
        set { _externalId = value; } }
}

因此,当您设置 id (例如myUnitMockDataBase.ExternalId = "some value")时,它会更改_externalId并完成。但在这种情况下:

public class UnitMockDataBase: MockDataBase
{
    public override string ExternalId { set { _externalId = value; } }
}

当您设置ExternalId(例如myUnitMockDataBase.ExternalId = "some value")时,它会调用该set块,并且在您的set块中您再次调用该set块!

要查看发生了什么,请在 中设置断点set并使用调用堆栈并跟踪代码执行步骤

于 2013-04-25T06:58:26.947 回答