2011-01-07 66 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