2016-05-29 74 views
-1

我正在研究一些學習材料,並遇到一些我不明白的代碼。c中構造函數之外的方法#

class Program 
{ 
    static void Main(string[] args) 
    { 
     var warrior = new Samurai(); 
     warrior.Attack("the evildoers"); 
     Console.ReadLine(); 
    } 

    class Sword 
    { 
     public void Hit(string target) 
     { 
      Console.WriteLine("Chopped {0} clean in half", target); 
     } 
    } 

    class Samurai 
    { 
     readonly Sword sword; 
     public Samurai() 
     { 
      this.sword = new Sword(); 
     } 

     public void Attack(string target) 
     { 
      this.sword.Hit(target); 
     } 
    } 
} 

就我個人而言,當我實例化的武士,我運行的方法public Samurai()。如果Attack方法在構造函數public Samurai()之外,方法warrior.Attack如何調用?

+0

'公共武士()'是'Samurai'類的構造函數,而不是一個方法。 Attack()方法已經在構造函數之外,因此我對你真正想知道的東西感到困惑。 –

+0

並添加到上面的評論中,您將通過Samurai類的對象調用Attack方法 –

+0

我不清楚你在問什麼。你不明白爲什麼'戰士。攻擊(「邪惡者」);'調用'武士'的'攻擊'方法,或者你不明白這個過程? – hvd

回答

2

武士類的構造函數實際上是

public Samurai() 
{ 
    this.sword = new Sword(); 
} 

這意味着,當你寫下面這段代碼:

var warrior = new Samurai(); 

您創建一個武士類的新實例,以及Samurai類構造函數中的代碼被執行。即爲這個武士創建一個劍的實例(this.sword = new Sword())。

劍類不包含構造函數,所以當劍的實例由Samurai構造函數創建時,Sword類中的其他任何東西都不會被調用。

new Samurai(); 

是你如何創建一個武士班的實例。

通過使用

var warrior = new Samurai(); 

您所創建的武士類的實例,也宣告了一個名爲「勇士」的變量,這將是你參考這個新創建的實例。

所以每當你想調用這個新創建的實例的「攻擊」的方法,你可以用你的代碼:

warrior.Attack("the evildoers"); 
+0

感謝您的澄清! – d1du