2012-03-04 123 views
2

我是C#的新手,並試圖理解類和「是」的關係。我一直試圖讓一段代碼工作,但我似乎無法做到。C#中的繼承/類#

它看起來像這樣:http://pastebin.com/cQDusptB

我有一個基類,哺乳動物,它應該能夠創建的實例,給哺乳動物作爲輸入的名稱。 我也有一堂課,狗,這是一種哺乳動物。人們應該能夠創建一個這樣的實例,就像哺乳動物一樣。

任何人都可以看到我的缺陷嗎?如果是的話,你能解釋一下我誤解/忘記了什麼嗎?

+0

你可以在你的問題中包含一個你正確的問題的小例子。不需要Pastebin。 – 2012-03-04 15:47:12

回答

1

這裏有幾個問題。首先,構造函數不能被標記爲虛擬或重寫。另一個問題是,您嘗試調用方法.Name而沒有括號。修正後的版本如下所示:

public class Mammal 
{ 
    protected string _Name; 

    public virtual string Name() 
    { 
      return (this._Name + " - of type " + this.GetType()); 
    } 
    public Mammal(string Name) 
    { 
     this._Name = Name; 
    } 
} 
public class Dog : Mammal 
{ 
    public Dog(string Name) : base(Name) 
    { 
    } 

    public override string Name() 
    { 
     return (base._Name + "Dog"); 
    } 
} 

static void Main() 
{ 
    Mammal AnimalA = new Mammal("SubjectA"); 
    Console.WriteLine("{0}", AnimalA.Name()); 

    Mammal AnimalB = new Dog("SubjectB"); 
    Console.WriteLine("{0}", AnimalB.Name()); 
    Console.ReadLine(); 
} 
+0

謝謝! - 我瞭解變化! - 我想知道,是否有任何簡單的解決方法,如果我想要只需調用.Name而不使用()? – Treelink 2012-03-04 16:07:58

+2

使用[properties](http://msdn.microsoft.com/en-us/library/x9fsa0sw(v = vs.100).aspx) – 2012-03-04 16:19:05

5

當發佈這樣的問題時,還會發布編譯器給您的錯誤消息。

任何人都可以看到我的缺陷嗎?

您有一個虛擬構造函數。

你能解釋一下我誤解/忘記了嗎?

構造被不是在C#繼承,因此它是沒有意義的它們標記爲任一虛擬倍率

3

狗的構造函數需要命名爲「狗」。你不能/不需要重寫「哺乳動物」。另外,Mammal的構造函數不應該是虛擬的。

public class Mammal 
{ 

    public Mammal(string name) 
    { 
     //.... 
    } 
} 

public class Dog : Mammal { 

    public Dog(string name) : base(name) 
    { 
    } 
} 

您使用「base」關鍵字將參數傳遞給基類構造函數(請參閱上面的代碼)。

一定要拿起一本關於C#的好書來獲得正確的語言基礎知識。

+0

謝謝。這是有道理的:) - 我有一本書,但我沒有完全得到這部分的解釋:( – Treelink 2012-03-04 16:09:30

1

構造函數不會被繼承/覆蓋。

  • 丟失Mammal類中Mammal構造函數中的'virtual'關鍵字。
  • 刪除Dog類中的哺乳動物覆蓋嘗試。
  • 與狗的構造函數調用哺乳動物一個(像這樣)替換它:

公狗(字符串名稱):基地(名) {

}

現在,當狗構建它將通過指定的名稱傳遞給哺乳動物基類的構造函數。