c# 多态

 多态是什么

我没有找到特别确切的定义,也许就是说同一种声明可以有不同的表现方式吧。 比如我们的重载,比如我们基类通过发展子类实现自己的不同变化。这里我主要想总结的是class继承的。

c# 没有多重继承,又单重,多层,接口继承。

 

   public class Animal
    {
        public virtual void Shout()
        {
            Console.WriteLine("动物叫");
        }
    }

    public class Cat : Animal
    {
        public override void Shout()
        {
            Console.WriteLine("猫叫,喵喵喵...");
        }
    }

    public class Dog : Animal
    {
        public override void Shout()
        {
            Console.WriteLine("狗叫,汪汪汪...");
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            Animal[] animals = new Animal[3];

            animals[0] = new Animal();
            animals[1] = new Cat();
            animals[2] = new Dog();

            for (int i = 0; i < 3; i++)
            {
                animals[i].Shout();
            }

            Console.Read();
        }
    }
View Code

 

 这个代码大家都很熟悉,一个基类下面有两个子类,通过override 重写了它的方法。运行结果

 

new的用法

从上面的例子都是父类的引用指向子类实例。我们也可以子类引用比如:Dog dog = new Dog(); 但是有种情况是我们想让父类引用调用它自己的方法而不是它子类的方法。这时候我们声明子类方法的时候就要使用到new关键字了。代码如下:

 

 public class Animal
    {
        public virtual void Shout()
        {
            Console.WriteLine("动物叫");
        }
    }

    public class Cat : Animal
    {
        public override void Shout()
        {
            Console.WriteLine("猫叫,喵喵喵...");
        }
    }

    public class Dog : Animal
    {
        public new void Shout()
        {
            Console.WriteLine("狗叫,汪汪汪...");
        }
    }
View Code

执行结果:

 多层继承就是子类的子类,增加一个狼狗代码:

   public class WolfDog : Dog
    {
        public override void Shout()
        {
            Console.WriteLine("狼狗叫,汪汪汪...");
        }
    }

这里要注意:父类是override 或者是 virtual才可以继承,不然会编译不通过。

抽象类和抽象方法

几大特征:

 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法

 (2) 抽象类不能被实例化

 (3)抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类

 (4)具体派生类必须覆盖基类的抽象方法

 (5)抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们

类的转换

Animal a = new Cat();
var cat = (Cat)a;
cat.Shout();
这个代码没有问题,虽然是Animal的引用,但是实际上这是个猫对象,所以转换成功。再看下面
 Animal animal = new Animal();
 var cat = (Cat)animal;
 cat.Shout();

这里运行就报错,父类不能强转成子类。我们再看一种情况


Cat c = new Cat();
 var animal = (Animal)c;
 animal.Shout();

子类可以转换成父类,但是结果出来的并不是父类的方法,而是子类重写后的方法。

 
posted @ 2018-12-10 10:16  UpOcean  阅读(153)  评论(0编辑  收藏  举报