2013-04-17 44 views
4

我有一個抽象類,它包含依賴於類級變量的方法。但是,這些變量的值是在從摘要繼承的類中設置的。最佳做法 - 在派生類中設置繼承變量

我已經寫了這個,以便在構造函數中設置變量 - 它似乎是迄今爲止最好的事情。但我只是對此感到不安 - 它們看起來應該是抽象的屬性。我不能把我的手指放在我爲什麼那樣的感覺上。

這裏是什麼,我究竟做了一個簡單的例子:

public abstract class TestBase 
{ 
    protected string itemType; 
} 

public class TestClass1 : TestBase 
{ 
    public TestClass1() 
    { 
     itemType = ConfigurationManager.AppSettings["TestClass1.ItemType"]; 
    } 
} 

public class TestClass2 : TestBase 
{ 
    public TestClass2() 
    { 
     itemType = ConfigurationManager.AppSettings["TestClass2.ItemType"]; 
    } 
} 

所以,問題是:

1)這是不好的做法?

2)如果是這樣,爲什麼,還有什麼更好?

3)這是一個測試類,用於迴歸測試而不是在任何地方部署。是否有一個很好的理由像在示例中那樣在config中設置類級變量,還是可以對它們進行硬編碼?我總是傾向於默認配置。

乾杯, 馬特

+0

我覺得你的實施非常舒服。 – David

回答

4

您可以沿着向右的構造函數(S)傳遞數據:

public abstract class TestBase 
{ 
    protected string itemType; // can now become 'readonly` 

    protected TestBase(string keyName) 
    { 
     itemType = ConfigurationManager.AppSettings[keyName]; 
    } 
} 

public class TestClass1 : TestBase 
{ 
    public TestClass1() : base("TestClass1.ItemType") 
    { 
     //itemType = ConfigurationManager.AppSettings["TestClass1.ItemType"]; 
    } 
} 

這種方式是比較一致的,並沒有那麼容易忘記的物品。

1

1:有很多要說的領域永遠是private;其他訪問雖然可以工作

2:

這裏最常見的方法可能是:

public abstract class TestBase { 
    private string itemType; 
    protected TestBase(string itemType) { 
     this.itemType = itemType; 
    } 
} 
public class TestClass1 : TestBase { 
    public TestClass1() : base(
     ConfigurationManager.AppSettings["TestClass1.ItemType"]) 
    {} 
} 

,但你也可以只使用:

public abstract class TestBase { 
    protected string ItemType {get;set;} 
    // or: 
    // public string ItemType {get;protected set;} 
} 
public class TestClass1 : TestBase { 
    public TestClass1() { 
     ItemType = ConfigurationManager.AppSettings["TestClass1.ItemType"]; 
    } 
} 

如果應用程序設定的名字始終與類型,你也可以用一些反思:

public abstract class TestBase { 
    private string itemType; 
    protected TestBase() { 
     itemType = ConfigurationManager.AppSettings[ 
      GetType().Name + ".ItemType"; 
    } 
} 
1

對我來說更好的方法是聲明抽象屬性。如果你忘記在繼承類中設置屬性,那麼編譯器會提醒你。

public abstract class TestBase 
{ 
    protected abstract string ItemType {get;} 
} 

public class TestClass1 : TestBase 
{ 
    protected override string ItemType 
    { 
     get { return ConfigurationManager.AppSettings["TestClass1.ItemType"];} 
    } 
}