C#语言入门详解(刘铁锰)---抽象类与开闭原则

C#语言入门详解(刘铁锰)视频教程:https://www.bilibili.com/video/BV1wx411K7rb

IDE:VS2019

.NET Core 3.1

1.概念            

            ///接口和抽象类(abstract)都是软件工程产物;

            ///具体类->抽象类->接口, 原来越抽象,内部实现的东西越来越少;

            ///抽象类是未完全实现逻辑的类(可以有字段和非public成员,它们代表了具体逻辑);

            ///抽象类为复用而生,专门用做基类,也具有解耦作用;

            ///抽象类中封装确定的。开放不确定的,推迟到合适的子类中去实现;

            ///接口是完全未实现逻辑的“类”(纯虚类;只有函数成员;成员全部public);

            ///接口为解耦而生:高内聚、低耦合,方便测试;

            ///接口是一个协约;

            ///接口和抽象类都不能实例化,只能用来声明变量,引用具体类的实例;

2.实例

/// <summary> 为做基类而生的抽象类与开闭原则 </summary>
    interface IVehicle
    {
        void FillFuel();
        void Run();
        void Stop();

    }
    abstract class Vehicle:IVehicle //存在抽象方法,所以为抽象类
    {
        public void Stop() 
        {
            Console.WriteLine("Stopped!");
        }
        public void FillFuel() 
        {
            Console.WriteLine("pay and fill fuel");
        }

        public abstract void Run(); //抽象方法
    }

    class Car : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("car is running...");
        }
    }

    class TrunkCar : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("trunkcar is running...");
        }
    }
    class RaceCar : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("racecar is sunning...");
        }
    }

3.开闭原则

OCP(Open  Closed  Principle)一个软件实体应该对扩展开放,对修改封闭。
上述例子中,
interface IVehicle抽象出了车辆的3个必备方法:
        void FillFuel();
        void Run();
        void Stop();

类Vehicle继承了IVehicle,
abstract class Vehicle:IVehicle 
类Vehicle实现了接口中的2个方法,对于所有车辆这两个方法是相同的
        public void Stop() 
        public void FillFuel() 
剩余的1个方法void Run()作为抽象方法开放给子类。Run()可能会根据具体车辆的不同而变化,所以声明为抽象方法留给子类去实现。
public abstract void Run(); //抽象方法
声明了3个子类,
class Car : Vehicle
class TrunkCar : Vehicle
class RaceCar : Vehicle
三个子类Car、TrunkCar、RaceCar的Run()方法很显然是不同的,分别实现了public abstract void Run()
public override void Run()
        {
            Console.WriteLine("car is running...");
        }
public override void Run()
        {
            Console.WriteLine("trunkcar is running...");
        }
        public override void Run()
        {
            Console.WriteLine("racecar is sunning...");
        }
按照上述代码组织结构,当需要给Vehicle添加新的子类时,不需要对Vehicle进行任何修改,只需要在新的子类中实现public abstract void Run()。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值