C# 虚方法 抽象类 接口的理解

多态

能让一个对象表现多个类型 形态
实现多态都是: 声名 父类 = new(指向子类)子类

虚函数

虚函数中的父类是可以有方法体{}的,且可以看到父类的标识是"virtual",子类的标识是"override".


 - 虚函数的函数及方法

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

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

    class Cat : Animal
    {
        public override void Dosth()
        {
            Console.WriteLine("猫咪是喵喵叫");
        }
    }

 - 主函数

 class Program
    {
        static void Main(string[] args)
        {
            Animal n = new Animal();
            n.Dosth();               //动物的嚎叫

            Dog d = new Dog();
            d.Dosth();               //狗狗是汪汪叫
            Animal a = new Dog();
            a.Dosth();               //狗狗是汪汪叫
			//上面的区别从哪导入Dog()这个函数,可以从父类也可以直接通过子类去导入这个函数
			
            Dog dg = new Animal();   //报错
            Console.ReadKey();
        }
    }

抽象类

抽象类的使用场景:

  1. 父类方法不知道如何去实现;
  2. 父类没有默认实现且不须要实例化

虚函数中的父类是没有有方法体{}的,且可以看到父类的标识是"abstract",子类的标识是"override".

抽象类父类有的方法,子类一定要有!!!
虚方法父类有的方法,子类可以有。

理解:
虚方法的父类的方法可以声名父类并调用,抽象类的父类方法里没有具体实例,就算声名了也用不了,所以抽象类里只要存在方法,子类就应该调用,不然抽象类中的方法是无意义的


 - 抽象类的函数及方法

 abstract class Brak
    {
        public abstract void Dosth(); //抽象类不应该有方法  方法前需要有public
    }

    class Dog:Brak
    {
        public override void Dosth()
        {
            Console.WriteLine("狗狗是汪汪叫");
        }
    }
    class Cat : Dog //注意这里Cat的爹是Dog
    {
        public override void Dosth()
        {
            Console.WriteLine("猫咪是喵喵喵的叫");
        }
    }

 - 主函数

 static void Main(string[] args)
        {
            //Brak b = new Brak()   //无法创建Brak接口

            Brak b1 = new Dog();    //狗狗是汪汪叫
            b1.Dosth();
            Dog d = new Dog();      //狗狗是汪汪叫
            d.Dosth();

            Dog d1 = new Cat();     //猫咪是喵喵喵的叫
            d1.Dosth();
            Brak b2 = new Cat();    //猫咪是喵喵喵的叫
            b2.Dosth();             //子类可以用父类(Cat的爹是Dog,Cat的爷爷是Bark)

            Console.ReadKey();
        }

接口(interface)

接口类似一种能力,创造这个能力后,谁都可以调用这个能力。


 - 接口、方法、函数

//接口
    public interface ISwimmingable
    {
        public void Swim();
    }

    //虚方法父类
    class Duck
    {
        public virtual void Dosth()
        {
            Console.WriteLine("鸭子是这么叫的");
        }
    }

    //真鸭子(虚方法、接口)
    class RealDuck : Duck, ISwimmingable
    {
        public override void Dosth()
        {
            Console.WriteLine("真的鸭子嘎嘎叫");
        }

        public void Swim()
        {
            Console.WriteLine("真的鸭子靠划水游泳");
        }
    }

    //木头鸭子(虚方法)
    class MuDuck : Duck
    {
        public override void Dosth()
        {
            Console.WriteLine("木头鸭子吱吱叫");
        }
    }

    ///橡皮鸭子(接口)
    class XPDuck : ISwimmingable
    {
        //public override void Dosth()
        //{
        //    Console.WriteLine("橡皮鸭子叽叽叫");
        //}

        public void Swim()
        {
            Console.WriteLine("橡皮鸭子靠发动机游泳");
        }
    }

 - 主函数

class Program
    {
        static void Main(string[] args)
        {
            //三个鸭子 真鸭子、木头鸭子、橡皮鸭子  叫的方法
            //真鸭子可以自己游泳、橡皮鸭子靠发电机游泳、木头鸭子不会游泳

            Duck n1 = new Duck();     //鸭子是这么叫的
            n1.Dosth();

            Duck n2 = new RealDuck();  //真的鸭子嘎嘎叫  (虚方法)
            n2.Dosth();
            ISwimmingable n3 = new RealDuck(); //真的鸭子靠划水游泳  (接口)
            n3.Swim();

            Console.ReadKey();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值