抽象类与接口的产生和使用

    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            car.Run();
            car.Stop();
        }
    }
    class Vehicle
    {
        public virtual void Run()
        {
            Console.WriteLine("Vehicle is Running");
        }
        public virtual void Stop()
        {
            Console.WriteLine("Vehicle is Stopped");
        }
        public virtual void Full()
        {
            Console.WriteLine("Full Fuel");
        }
    }
    class Car:Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is Running");
        }

        public override void Stop()
        {
            Console.WriteLine("Car is Stopped");
        }
    }
}

我们发现这个例子中,Vehicle类中的方法根本没有用到过,而且Vehicle is Running 这种说法太不具体了。
因此我们修改Vehicle类,让方法里啥都别写了:

    class Vehicle
    {
        public virtual void Run() { }
        public virtual void Stop() { }
    }

但是啥都别写这不合适吧,干脆把方法体也去掉吧,只留方法名
以下这段代码无法通过编译,只是举例用哦

    class Vehicle
    {
        public virtual void Run() ;//这样是无法编译的
        public virtual void Stop() ;//这样是无法编译的
    }

本来就是虚方法(virtual),现在方法体也没了,更虚了,因此诞生了——抽象方法

    abstract class Vehicle
    {
        public abstract void Run();
        public abstract void Stop();
    }

使用时,重写依然是override,因此仅仅替换即可,无需更改。
抽象类是专门为了做基类而生的,因为抽象类无法实例化,即使抽象类内部有实际的方法,也因为有抽象方法而无法调用所有的方法而报错。
例如:

    abstract class Vehicle
    {
        public abstract void Run();
        public abstract void Stop();
        public void full()
        {
            Console.WriteLine("Full Fuel");
        }
    }

即使有具体方法full(),依然不可以实例化。

那么刚才说的这个特别抽象,抽象到不含有任何实际方法的抽象类

    abstract class Vehicle
    {
        public abstract void Run();
        public abstract void Stop();
    }

猜你喜欢

转载自www.cnblogs.com/maomaodesu/p/11612580.html