2015-08-03 152 views
-6
abstract class Animal 
    { 
     public string DefaultMessage { get; set; } 

     public Animal() 
     { 
      Console.WriteLine("Animal Cstor called"); 
      DefaultMessage = "Default Speak"; 
     } 
     public virtual void Speak() 
     { 
      Console.WriteLine(DefaultMessage); 
     } 
    } 

    class Dog : Animal 
    { 
     public Dog() 
      : base()//base() redundant. There's an implicit call to base here. 
     { 
      Console.WriteLine("Dog cstror called"); 
     } 
     public override void Speak() 
     { 
      Console.WriteLine("Custom Speak");//append new behavior 
      base.Speak();//Re-use base behavior too 
     } 
    } 

否則抽象類構造函數和普通類構造函數的區別?

class Animal 
    { 
     public string DefaultMessage { get; set; } 

     public Animal() 
     { 
      Console.WriteLine("Animal Cstor called"); 
      DefaultMessage = "Default Speak"; 
     } 
     public virtual void Speak() 
     { 
      Console.WriteLine(DefaultMessage); 
     } 
    } 

    class Dog : Animal 
    { 
     public Dog() 
      : base()//base() redundant. There's an implicit call to base here. 
     { 
      Console.WriteLine("Dog cstror called"); 
     } 
     public override void Speak() 
     { 
      Console.WriteLine("Custom Speak");//append new behavior 
      base.Speak();//Re-use base behavior too 
     } 
    } 
  1. 什麼是抽象類的構造函數和普通類的構造函數之間的區別是什麼?
+3

做你自己的家庭作業和讓別人爲你做這件事有什麼區別?你甚至明白你在問什麼? – CodeCaster

+0

## CodeCaster DUDE ##我從CHILDHOOD開始做主題現在我正在尋求這個問題抽象類構造函數和普通類構造函數有什麼區別? –

+4

是的,我可以讀。區別在於一個是抽象的,另一個不是。你爲什麼想知道?那實際上是你想知道的嗎?你將如何處理答案?如果這歸結爲_「解釋C#中的抽象手段」_,它實際上太寬泛了。 – CodeCaster

回答

1

沒有區別,而不是一個抽象類的構造函數不能公開呼籲,因爲否則會破壞抽象類的目的(即它們必須被繼承,不能直接實例化,從而抽象類公共構造可以由派生類構造函數調用的只有)。

1

雖然你不能實例化一個抽象類,但它可能有一個從派生類中調用的構造函數。因此,抽象的一個不應該是公開的,但應該保護。因此,從API角度來看,唯一的區別是第一個不能直接從任意類中調用,而普通的constrcutor可以在任何地方都被調用(當然取決於訪問修飾符)。

更確切地說:一個Animal類應該不會是抽象的。那意味着有動物存在,不能進一步分類爲貓,狗或任何其他動物。