C#OOP抽象基类和继承属性

时间:2013-04-25 06:55:42

标签: c# oop base-class

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

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,只有一些派生类使用它并且需要过度使用。

感谢

2 个答案:

答案 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中设置一个断点并使用调用堆栈并跟踪代码执行步骤