2015-10-14 35 views
1

我正在構建一個簡單的德語學習幫助程序,其中一個元素是字典。爲了管理所有單詞,我添加了三個類:Noun,AdjectiveVerb。它們都從另一個抽象類Word繼承。名詞類還包含一個Article枚舉。 所有單詞(形容詞,名詞和動詞對象)都存儲在一個List<Word> ..我無法在ListView列或更具體地打印它們 - 訪問我想要的字段。C#在超類對象上操作時獲取對子類變量的訪問

基本上,我想遍歷列表中的所有單詞。在做這件事時,檢查當前項目是否是名詞(名詞類型的對象) - 如果是,請獲取其文章。如果不是,打印「 - 」,然後將單詞翻譯添加到列。

這裏是方法:

private void UpdateList(List<Word> currentWordList) //passing the List 
{ 
    wordsListView.Items.Clear(); 
    int index = 1; // first column of the number 

    foreach (Word w in currentWordList) 
    { 
     ListViewItem newItem = new ListViewItem("" + index); 
     if (w is Noun) 
      newItem.SubItems.Add(w.Article); //here is the error (no definition for "Article") 
     else 
      newItem.SubItems.Add("--"); 

     newItem.SubItems.Add(w.GermanTranslation); 
     newItem.SubItems.Add(w.PolishTranslation); 

     wordsListView.Items.Add(newItem); 
    } 
} 

如何解決這個問題?

非常感謝您的幫助。

+0

考慮在GUI元素上使用數據綁定。覆蓋''ToString()'的類(如'Word'及其子類),你想要保存在列表中。當GUI元素實際上*是實際數據時,許多事情變得更加容易。 –

+0

您試圖違反面向對象設計的一些基本原則。超類不應該對某個特定的子類有任何依賴。如果子類可以實現哪些超類需要調用的功能,則將功能抽象化並在子類中實現它。 – David

+0

@大衛苛刻的話。您認爲OP如何試圖將「對特定子類的依賴」引入超類? (依賴/知識將在此處引入GUI控制代碼,imo。) –

回答

5

你可以施放wNoun這樣的:

Noun noun = (Noun)w; 

然後使用noun變量訪問Article

說了這樣的話,更好的方法是在Word中定義一個抽象方法,名爲GetDescription,它可以獲取單詞的描述。

下面是一個例子:

public abstract class Word 
{ 
    public abstract string GetDescription(); 
    //.... 
} 

public class Noun : Word 
{ 
    public override string GetDescription() 
    { 
     //Here you can access the Article property 
     //... 
    } 
    //... 
} 

然後在循環中,你可以使用GetDescription方法來獲取每個字的說明。

+0

你可能會將第一個陳述改爲「你*可以*演員,如果你真的想......」,因爲演員絕對不是OP「應該」做的。這個答案的其餘部分是OP *應該做的:) – David

+0

非常感謝! @David - 爲什麼演員是我不應該做的事情?我是一名新秀,如果在這種情況下施放是一種不好的做法,我很想知道爲什麼;)謝謝! – Dandry

+0

@Dandry:查看「S.O.L.I.D.」面向對象設計的原則。這與Liskov替代原則特別相關。在這種情況下,轉換是在對象的實現細節「窺探下」,而不是僅使用其暴露的接口。這會造成緊密耦合,並使代碼非常難以維護。鑄造有其用途,但這不是其中之一。 – David

1

您需要將W轉換爲子類。像這樣

newItem.SubItems.Add(((Noun)w).Article) 
+0

謝謝你的幫助! – Dandry