多态/类型铸造用法

时间:2011-01-07 05:57:47

标签: oop language-agnostic

我对多态性一直保持警惕,但仍然认为我不能完全理解这个概念。

我理解多态作为一个对象可以采取多种形式。那么一个对象可以是一种形式,然后是另一种形式吗?

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

现在我希望猫是超级猫,这是“多态”吗?

SuperCat supCat = (SuperCat)newCat;

这不就像投射吗?你想什么时候使用铸造?以上代码行是否有效?所以newCat转换为Supercat,它会给newCat更多的内存分配吗?然后将其复制到supCat中?

注意 - 多态性是接口的使用?

5 个答案:

答案 0 :(得分:3)

只是对你的笔记发表评论。

有两种类型的多态性。

编译时间多态:

这是在编译之前定义多态行为的地方。 这种情况发生在方法重载上,例如

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

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

运行时多态:

这是多态行为在运行时发生的地方。 一个例子是接受实现特定接口(或公共基类)的类型的方法。根据正在执行的代码,此接口可以是不同的类型。

e.g。

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的输出将是射击,而对于一把刀,它将是Stab。

我没有测试过这段代码,因此可能存在语法错误等,但您应该能够理解

答案 1 :(得分: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.
}

答案 2 :(得分:1)

多态性允许一种类型表达某种契约,并允许其他类型以不同的方式实现该契约(无论是否通过类继承),每种类型都根据自己的目的。使用该合同的代码不应该(*)关心涉及哪个实施,只需要遵守合同。

取自这篇文章。

Polymorphism - Define In Just Two Sentences

答案 3 :(得分:0)

不,这不是“多态” SuperCat是一只猫,但并非所有的猫都是SuperCat。

答案 4 :(得分:0)

多态性意味着您的SuperCat同时是SuperCat,Cat和哺乳动物。它可以被视为三者之一。

Poly - &gt;许多

态射 - &gt;映射或'输入'