理解多态之前还要要对面向对象的里氏替换原则和开放封闭原则有所了解。
里氏替换原则(Liskov Substitution Principle):派生类(子类)对象能够替换其基类(超类)对象被使用。通俗一点的理解就是“子类是父类”,举个例子,“男人是人,人不一定是男人”,当需要一个父类类型的对象的时候可以给一个子类类型的对象;当需要一个子类类型对象的时候给一个父类类型对象是不可以的!
开放封闭原则(Open Closed Principle):封装变化、降低耦合,软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。因此,开放封闭原则主要体现在两个方面:对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
面向对象的魅力就是多态,多态用的好,可以提高程序的扩展性。常用的设计模式,比如简单工厂设计模式,核心就是多态。在上一篇博客当中,已经总结过虚方法和抽象方法了下边在进行一下简单的比较。
先看我们上一篇的这个小例子
public class Animal
{
public virtual void Eat()
{
Console.WriteLine(“Animal eat”);
}
}
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("Cat eat");
}
}
public class Bird : Animal
{
public override void Eat()
{
Console.WriteLine("Bird eat");
}
}
class Tester
{
static void Main(string[] args)
{
Animal[] animals = new Animal[3];
animals[0] = new Animal();
animals[1] = new Cat();
animals[2] = new Bird ();
for (int i = 0; i < 3; i++)
{
animals[i].Eat();
}
}
}
输出如下:
Animal eat...
Cat eat...
Bird eat...
接下来要给给bird加一个飞翔的功能怎么办呢?我们此时就不能再父类animal中去添加fly方法了,因为cat不会飞,此时我们就需要一种新的规则了,那就是接口。
public interface IFly
{
void Fly();
}
我们只需要将上边例子中的bird改成如下这种即可
public class Bird : Animal,interface
{
public override void Eat()
{
Console.WriteLine("Bird eat");
}
public void Fly()
{
Console.WriteLine("Bird fly");
}
}
这样就可以输出fly的功能了,而且bird和cat之间并没有互相冲突。用接口实现多态程序的扩展性得到了大大提升,以后不管是再扩展一个蝴蝶(Butterfly),还是鸟人(Birder)创建一个类,实现这个接口,在主函数中添加该对象就可以了。
也不需要查看源代码是如何实现的,体现了开放封闭原则!
接口充分体现了多态的魅力
那么什么是接口呢
简单来说,接口就是抽象的一种约定,接口就是用来实现的。
把类和接口进行一下比较:
不同点:接口不能直接实例化,不包含方法的实现,接口可以多继承,类只能单继承
相同点:与类相似,接口可以包含方法、属性、索引器和事件作为成员。接口,类结构都可以从多个接口继承,接口类似于抽象类:继承接口的任何非抽象类都必须实现接口的所有成员。
总之,类之间不支持多重继承,但是接口支持,类对接口叫做实现,不叫继承,类是爹,接口是能力,能有多个能力,但不能有多个爹。哈哈。
-
顶
- 0
-
踩