2015-02-04 24 views
1

有一些新手問題。 我有6個班級:使用子類和方法的最佳方式

public class MainSettingsClass 
{ 
    int a; 
    int b; 
} 

public class SubSettingsClass_1 : MainSettingsClass 
{ 
    int c; 
} 

public class SubSettingsClass_2 : MainSettingsClass 
{ 
    int d; 
} 

public class ParentClass 
{ 
    public MainSettingsClass settings; 
} 

public class ChildClass_1 : ParentClass 
{ 
} 

public class ChildClass_2 : ParentClass 
{ 
} 

現在的問題。 ChildClass_1與SubSettingsClass_1和ChildClass_2與SubSettingsClass_1

ChildClass_1 firstClassVar = new ChildClass_1(); 
ChildClass_2 secondClassVar = new ChildClass_2(); 
SubSettingsClass_1 firstClassSettings = new SubSettingsClass_1(); 
SubSettingsClass_2 secondClassSettings = new SubSettingsClass_2(); 
firstClassVar.settings = (MainSettingsClass)firstClassSettings; 
secondClassVar.settings = (MainSettingsClass)secondClassSettings; 

主要的事情,如果我需要使用 「firstClassVar.settings」 得到 「C」 變我需要每次寫:

((firstClassSettings)firstClassVar.settings).c 
  1. 是不是正確的方式訪問變量?
  2. 還是有更好的方法存在?
  3. 此代碼是否對應編程規則?或者它不正確?

對不起,英語不好。

回答

2

你有什麼是技術上精細,雖然有幾個有點問題方面。首先,沒有必要投到MainSettingsClass。由於SubSettingsClass_1SubSettingsClass_2均繼承自MainSettingsClass,因此ParentClass及其所有派生詞都將接受定義爲類型爲MainSettingsClass的字段的值。

其次,字段(其中settings是其中之一)通常不公開。定義了getter和setter的屬性通常是對象上數據的接口。

三,settings這裏是一個依賴項,因此,應該通過類的構造函數注入。喜歡的東西:

public class ParentClass 
{ 
    protected MainSettingsClass settings; 

    public ParentClass(MainSettingsClass settings) 
    { 
     this.settings = settings; 
    } 
} 

UPDATE

還有一件事我想過這個問題將是有益的,你就知道了。請記住,通過使用最少公分母MainSettingsClass,您將失去與更具體派生類SubSettingsClass_1SubSettingsClass_2的特定成員一起使用的能力。然而,仿製藥可以用來給你多一點靈活性:

public class ParentClass<TSettings> 
    where TSettings : MainSettingsClass 
{ 
    protected TSettings settings; 

    public ParentClass(TSettings settings) 
    { 
     this.settings = settings; 
    } 
} 

public class ChildClass_1 : ParentClass<SubSettingsClass_1> 
{ 
    ... 
} 

public class ChildClass_2 : ParentClass<SubSettingsClass_2> 
{ 
    ... 
} 

有了這一點,你可以用cChildClass_1dChildClass_2現在的工作,因爲你settings字段的類型將分別SubSettingsClass_1SubSettingsClass_2, 。

+0

感謝您收到我忘記談論的代碼中所有可怕的做法。 +1 – BradleyDotNET

+0

謝謝,這很有用! – denismart

3
  1. 這是「正確」的方式來訪問c變量嗎? 。如果您向下轉型,至少首先檢查它:

    firstClassSettings derivedSettings = firstClassVar.settings as firstClassSettings; 
    if (derivedSettings != nulL) 
    { 
        //Do whatever with derivedSettings.c 
    } 
    
  2. 有一個更好的辦法:)其所謂多態性。你的課是超一般的,所以很難說正好你的設計應該看起來如何,但是你的主類應該有一些派生類重寫的方法來獲得自定義行爲。

  3. 向下鑄造是巨大的代碼味道。有時候沒有辦法解決它(特別是在遺留代碼中,或者在某些Object覆蓋和WPF接口中),但是,如果可能的話,應該避免它。雙倍於你自己的物體/代碼。

+0

是否可以更改變量的類型? 例如: public class ChildClass_1:ParentClass { public SubSettingsClass_1 settings; } 例如我有循環。我不知道在循環中將使用什麼對象Child_1或Child_2,但每次我需要獲取它們(共享,「a」或「b」)設置類變量。 Child_1對象只有Subsettings_1,而Child_2只有Subsettings_2。如何在循環中訪問變量「a」? – denismart

+0

@denismart按照原樣使用:)。該變量已經是'MainSettingsClass'類型,所以你可以安全地寫'settings.a'。 **上傳**非常普遍,非常安全。它的下調你必須小心。 – BradleyDotNET

+0

謝謝!現在明白了! – denismart