2013-04-25 70 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