2013-04-25 52 views
0

如果这是个问题,请道歉。
我有以下的抽象基类:C#OOP抽象基类和继承属性

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; } 

而且dervied类覆盖它的制定者,如何实现呢?基类不能有外部id,只有一些派生类使用它,并且需要超驰。

感谢

回答

3

这将引发堆栈溢出。

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

因为你进入无限循环试图设置在二传手的财产。如果你要实现自定义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; 
     } 
    } 
} 
+0

谢谢你的答案 – ilansch 2013-04-25 07:08:37

+0

@ilansch,欢迎您 – Habib 2013-04-25 07:11:00

1

要调用无限循环的set。为了解决这个问题,改变你这样的代码:

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

所以,当你设置的编号(例如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发生设置一个断点,并使用调用栈和跟踪代码执行步骤

+0

谢谢你的回答 – ilansch 2013-04-25 07:08:00