我对多态性一直保持警惕,但仍然认为我不能完全理解这个概念。
我理解多态作为一个对象可以采取多种形式。那么一个对象可以是一种形式,然后是另一种形式吗?
Mammal (base class) cat (subclass of mammal) supercat (subclass of cat)
Cat newCat = new Cat();
现在我希望猫是超级猫,这是“多态”吗?
SuperCat supCat = (SuperCat)newCat;
这不就像投射吗?你想什么时候使用铸造?以上代码行是否有效?所以newCat转换为Supercat,它会给newCat更多的内存分配吗?然后将其复制到supCat中?
注意 - 多态性是接口的使用?
答案 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)
多态性允许一种类型表达某种契约,并允许其他类型以不同的方式实现该契约(无论是否通过类继承),每种类型都根据自己的目的。使用该合同的代码不应该(*)关心涉及哪个实施,只需要遵守合同。
取自这篇文章。
答案 3 :(得分:0)
不,这不是“多态” SuperCat是一只猫,但并非所有的猫都是SuperCat。
答案 4 :(得分:0)
多态性意味着您的SuperCat同时是SuperCat,Cat和哺乳动物。它可以被视为三者之一。
Poly - &gt;许多
态射 - &gt;映射或'输入'