2009-06-25 84 views
3

我得到了一個抽象類:只覆蓋get訪問

abstract class ClassBase 
    { 
     public abstract string Test { get; } 
    } 

我想要得到它,順便添加一組accesor

class ClassDerive : ClassBase 
    { 
     string _s; 

     public override string Test 
     { 
      get { return _s; } 
      set { _s = value; } 
     } 
    } 

我不能這樣做,因爲我可能不覆蓋設置

class ClassDerive2 : ClassBase 
    { 
     string _s; 

     public string Test 
     { 
      override get { return _s; } 
      set { _s = value; } 
     } 
    } 

語法錯誤

class ClassDerive3 : ClassBase 
{ 
    string _s; 

    public override string ClassBase.Test 
    { 
     get { return _s; } 
    } 

    public string Test 
    { 
     set { _s = value; } 
    } 
} 

語法錯誤

任何想法?

thx

回答

3

如果一開始你定義的類型只讀屬性,你以後不能將其更改爲讀/在派生類中寫屬性。這就是.NET的工作原理,無法更改。

如果,另一方面,你定義一個接口具有隻讀屬性,以後可以實現一類接口與可寫的屬性。

如果你想分享你想達到什麼樣的,也許我們能拿出的作品,並可以編譯:)

+0

您好, thx爲答案。我沒有「真正」的問題。因爲在我的設計中,我可以在基類中添加set accesor。 但我只是想知道... – Pitming 2009-06-25 13:37:26

+0

好吧。通常情況下,事實證明你並不是真的需要這種能力,因爲你通常可以設計自己擺脫這種困境。不是我說你永遠不需要它,但大多數情況下你不需要... – 2009-06-25 17:25:30

1

不,你不能,對不起。這是設計,所以這是法律。

6

你不能這麼做正是你想要做什麼,但這裏是一個解決辦法:

abstract class ClassBase 
{ 
    public abstract String Test { get; } 
} 

class ClassDerive : ClassBase 
{ 
    string _s; 

    public override string Test 
    { 
     get { return _s; } 
    } 

    public void SetTest(String test) 
    { 
     this._s = test; 
    } 
} 

這將通過公共SetTest方法使Test只可設置在ClassDerived。我知道這並不像使用該物業的二傳手那麼幹淨,但它的效果與它將要獲得的一樣好。

2

另一種方式設計:


    abstract class ClassBase 
    { 
     public abstract string Test { get; } 
    } 

    class ClassDerive : ClassBase 
    { 
     string _s; 
     protected void setTest(string s) 
     { 
      _s = s; 
     } 

     public override string Test 
     { 
      get { return _s; } 
     } 
    } 

    class ClassDerive2 : ClassDerive 
    { 
     public new string Test 
     { 
      get { return base.Test; } 
      set { setTest(value); } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var cd2 = new ClassDerive2(); 
      cd2.Test = "asdf"; 
      Console.WriteLine(cd2.Test); 
     } 
    } 
1

我首先想到的也是爲了實現它作爲一個接口。如果這符合您的設計,以下代碼將起作用:

public interface TestInterface 
{ 
    string TestProperty { get; } 
} 

public class TestClass : TestInterface 
{ 
    public string TestProperty 
    { 
     get { return "test"; } 
     set { string t = value; } 
    } 
}