2011-07-02 71 views
4

請告訴我什麼是父對象與子類像實例:什麼是使用父對象與子類的實例

public class A 
    { 
     public A() 
     { 
      Console.WriteLine("A"); 
     } 
     public virtual void method() 
     { 
      Console.WriteLine("AM"); 
     } 

    } 
    public class B : A 
    { 
     public B() 
     { 
      Console.WriteLine("B"); 

     } 
     public new void method() 
     { 
      Console.WriteLine("BM"); 

     } 
     public void method1() 
     { 
      Console.WriteLine("BM1"); 
     } 
    } 

class Program 
    { 
     static void Main(string[] args) 
     { 
      A obj = new B();// what is use of it? 
      obj.method();    
      Console.Read(); 
     } 
     private void methodP1() 
     { 

     } 
    } 

請告訴我什麼是使用 家長的obj =新的兒童(); 因爲我只能調用父類的公有方法,所以可以使用 父obj = new Parent();

是否有可能:Child obj = new Parent()?

回答

9

請告訴我父母使用什麼 obj = new Child();因爲我只能 調用父母 類可能使用父母 obj =新父母();

這是polymorphism的基礎:假設您有幾個繼承自父類的子類。您希望通過父類上定義的接口/方法來使用所有這些子類,而不必擔心每個子類中的實現細節(每個類可能會做不同的事情,但具有相同的整體語義)。

這是可能的,因爲孩子類與父類具有IS關係,因爲孩子從父類繼承。

1

如果你只需要使用父類的方法,你可以繼續實例化它。子類的對象是在保持父類完整的同時向父類添加功能。在沒有進一步使用子功能的情況下通過子實例化父代是沒有意義的。

+0

不明白,請提供更多詳細信息 –

+0

如果您只需要使用父類的功能,則不需要通過子類來實例化它。 – Banago

6

在您的例子,B 是-一個 A,而A是-未一個 B.

以上是使用時使用所述參考B只能理解的代碼(或需要的理解)類型A,B的是專業化 A的想象像(僞代碼)

Shape s; 
if (x == 1) { 
    s = new Square(); 
} 
else { 
    s = new Triangle(); 
} 
// following code knows only about Shapes 
s.draw(); 
s.calculateArea(); 

下面的代碼並不需要知道,如果s是正方形或三角形,只是這是一個形狀。那有什麼用處?如果您致電s.draw(),形狀本身決定了它的外觀。調用它的代碼不知道或不在意。

這是面向對象編程的一個關鍵點。 要求對象爲你做事,而不是自己決定自己需要什麼

請注意,使用此示例時,最終問題並不直觀。

Shape s = new Square(); //細

VS

廣場S =新式樣(); //你可以實例化一個「形狀」,爲什麼然後你認爲它是一個正方形?

1

在像你這樣簡單的例子中,變量的使用範圍是有限的,沒有用處。但重要的是要明白,.NET變量的類型是靜態的,在編譯時已知,即使obj保留對Child類的引用,它仍然鍵入爲Parent

而當你有需要Parent方法,可以傳遞obj(具有類型Child)到它(它仍然表現得像Child) - 這是由Parent類型被稱爲的Child一個例子。

Child obj = new Parent()是不可能的,Parent不是Child,編譯器不會讓您將對象分配給不兼容類型的變量。

0

假設你有一個叫做動物和兒童類的父類,稱爲狗,貓和蜥蜴。每個類都有一個方法調用makeSound()。然後當你說Animal a1 = new Dog();Animal a2 = new Cat(),a1.makeSound()會叫,a2.makeSound()會喵。

此行爲的技術術語稱爲多態性。它對代碼重用很有用。你只需要爲具有Animal makeSound()的應用程序編寫一次代碼,而不是爲每個動物類型分別編寫代碼。

多態性的另一種用法是隱藏您的代碼從其他用戶的實現。例如,您可以向其他用戶顯示您正在使用列表,然後您可以選擇將列表實現爲LinkedList或ArrayList。您也可以選擇LinkedList,然後在不影響用戶的情況下切換到ArrayList。

你也不能說Dog d = new Animal()因爲狗是一種動物,但動物不一定是狗。

+0

「你能證明你使用的是列表中的其他用戶,然後,你必須實現List作爲一個LinkedList或作爲一個ArrayList的選擇。」你說什麼?你暗示你可以推遲指定列表的類型? – BillW

1

您將使用多態性的原因是,您可以將更具體的對象傳遞給僅需要更一般對象的實體。接收對象的實體只關心暴露的公共接口,而不關注如何執行該接口中的方法的細節。這裏有一個簡單的類層次結構:

public class Animal 
{ 
    public virtual string GetFood() 
    { 
     return "Food";   
    } 
} 

public class Monkey : Animal 
{ 
    public override string GetFood() 
    { 
     return "Bananas"; 
    } 
} 

public class Cow : Animal 
{ 
    public override string GetFood() 
    { 
     return "Grass"; 
    } 
} 

這裏是你如何可以使用多態:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Animal[] animalArray = { new Monkey(), new Cow() }; 
     foreach (Animal a in animalArray) { 
      WhatDoIEat(a); // Prints "Bananas", then "Grass" 
     }   
    } 

    static void WhatDoIEat(Animal a) 
    { 
     Console.WriteLine(a.GetFood()); 
    } 
} 
5

BrokenGlass的答案是正確的。但是,根據是否將obj聲明爲AB,您的示例將具有不同的行爲。

對於A obj = new B();,程序將輸出A B AM,因爲編譯器正在鏈接到虛擬方法A.method,然後繼承B類。

B obj = new B();的程序的情況下,輸出A B BM因爲編譯器被定向爲使用方法弘()。

如果B.method()改爲聲明爲public override void method(),那麼無論obj是聲明爲A型還是B型,輸出總是A B BM。

因此,您的示例沒有顯示經典意義上的多態,因爲在類型B的實例上調用的方法取決於實例分配給的變量的類型。這可以使調試樂趣和有趣。

0

當你知道從繼承,當你不知道確切的孩子,你可以把父類,只要你知道子類可以在其上分配這些值的數據A類普通功能。

相關問題