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; }
并且代替类重写它的setter,我该如何实现呢?基类不能有外部id,只有一些派生类使用它并且需要过度使用。
感谢
答案 0 :(得分:2)
这会引发堆栈溢出。
public override string ExternalId { set { ExternalId = value; } }
因为你要进入一个无限循环试图在setter中设置属性。如果您要实现自定义的setter,那么您应该摆脱自动实现的属性,定义一个字段并通过您的属性封装它。
对于另一个问题
基类不能有外部id,只有一些派生类使用它并且需要过度使用。
这就是你拥有proctected访问说明符的原因。你可以像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;
}
}
}
答案 1 :(得分: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
中设置一个断点并使用调用堆栈并跟踪代码执行步骤