2011-01-07 68 views
0

我一直對多態性有點警惕,但仍然不認爲我最充分地理解了這個概念。多態/類型投射使用

我瞭解多態,因爲對象可以有多種形式。所以一個對象可以是一種形式,然後是另一種形式?

 
Mammal (base class) 
cat (subclass of mammal) 
supercat (subclass of cat) 
Cat newCat = new Cat(); 

現在我想貓是supercat,這是 「多態」?

SuperCat supCat = (SuperCat)newCat; 

這不就像鑄造嗎?你想什麼時候使用鑄造?上面的代碼行是否有效?所以newCat被轉換爲Supercat,它是否給newCat更多的內存分配?然後將其複製到supCat?

注 - 多態是使用接口嗎?

+0

對不起,您的多態性的理解偏了。多態性只是不同類型分享某些行爲的一種方式,而其他行爲則不同。如果你想將任何`Cat`轉換成`SuperCat`,你必須自己編寫這些代碼。 – mquander 2011-01-07 06:00:33

回答

3

只是對您的筆記發表評論。

有兩種類型的多態性。

編譯時多態性:

這是你的多態行爲是在編譯之前定義。 這發生在方法重載例如

public bool DoSomeThing(int myVal) 
{ 
    // some code here 
} 

public bool DoSomeThing(double myVal) 
{ 
    // some code here 
} 

運行時多態性:

這就是多態行爲發生在運行時。 這是一個接受實現特定接口(或公共基類)的類型的方法。根據正在執行的代碼,此接口可以是不同的類型。

例如

public interface IWeapon 
{ 
    void Strike(); 
} 

public class Knife : IWeapon 
{ 
    public void Strike() 
    { 
    Console.WriteLine("Stab"); 
    } 
} 

public class Gun : IWeapon 
{ 
    public void Strike() 
    { 
    Console.WriteLine("Shoot"); 
    } 
} 

public class Warrior 
{ 
    public void Attack(IWeapon weapon) 
    { 
    weapon.Strike(); 
    } 
} 

現在如果戰士拿到槍,Attack的輸出將會是射擊,而對於一把刀來說它會是刺。

我沒有測試此代碼,所以可能有語法錯誤等,但你應該能明白我的意思

+0

謝謝,在接口之前,我仍然總是想知道爲什麼除了給課程提供相同的行爲外,爲什麼要使用它們,但將它們分組在一起並以時尚方式使用它們的想法確實很酷並且很有意義。謝謝。 – RoR 2011-01-07 06:51:57

0

不,這不是「多態」 SuperCat是一隻貓,但不是所有的貓都是SuperCat的。

0

多態性意味着您的SuperCat是一個SuperCat,一隻貓和一隻哺乳動物,它們都在同一時間。它可以被視爲這三種中的任何一種。

聚 - >許多

態射 - >映射或「類型」

1

多態性是你通過一個基本類型接口的子類型的對象進行交互。例如:

List<Cat> cats = new List<Cat>(); 
cats.Add(new Cat()); 
cats.Add(new SuperCat()); 

foreach (Cat cat in cats) 
{ 
    cat.Meow(); // Works whether cat refers to a Cat or SuperCat. 
       // If SuperCat has its own Meow implementation, that is called. 
} 
1

多態性允許一個類型來表達某種合同,以及其他類型執行該合同(無論是通過類繼承與否)以不同的方式,每個根據自己的目的。使用該合同的代碼不應該(*)必須關心涉及哪個實現,只需要遵守合同。

取自本帖。

Polymorphism - Define In Just Two Sentences