【C#语言入门】21. 抽象类与开闭原则

【C#语言入门】21. 抽象类与开闭原则

一、什么是接口和抽象类

  • 接口和抽象类都是“软件工程的产物”
  • 具体类——》抽象类——》接口:越来越抽象,内部实现的东西越来越少
  • 抽象类是未完全实现逻辑的类(可以有字段和非public成员,他们代表了“具体逻辑”,至少有一个抽象,且不能为private)
  • 抽象类为复用而生:专门作为基类来使用,也具有解耦功能
  • 封装确定的,开放不确定的,推迟到合适的子类中去实现
  • 接口是完全未实现逻辑的“类”(纯虚类;只有函数成员;成员全部public)
  • 接口为解耦而生:“高内聚,低耦合”,方便单元测试
  • 接口设计一个“协约”,早已为工业生产所熟知(有分工必有协作,有协作必有协约)
  • 它们都不能实例化,只能用来声明变量,引用具体类(concrete class)的实例
//为做基类而生的“抽象类”与“开放/关闭原则”
class Program
{
    static void Main(string[] args)
    {

    }
}

abstract class Student//一旦一个类里面有了抽象方法,那他就成为了抽象类,需要加上abstract
{
    abstract public void Study();
}
//为做基类而生的“抽象类”与“开放/关闭原则”
class Program
{
    static void Main(string[] args)
    {
        Vehicle v1 = new Truck();
        v1.Run();
    }
}
abstract class Vehicle
{
    public void Stop()
    {
        Console.WriteLine("Stopped.");
    }

    public void Fill()
    {
        Console.WriteLine("Pay and fill");
    }

    //public virtual void Run()
    //{
    //    Console.WriteLine("Vehicle is running");
    //}

    public abstract void Run();
}

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

}

class Truck:Vehicle
{
    public override void Run()
    {
        Console.WriteLine("Truck is rumming.");
    }

}

class RaceCar : Vehicle
{
    public override void Run()
    {
        Console.WriteLine("RacCar is running.");
    }
}
//为做基类而生的“抽象类”与“开放/关闭原则”
class Program
{
    static void Main(string[] args)
    {
        Vehicle v1 = new Truck();
        v1.Run();
    }
}

interface IVehicleBase//接口默认都是abstruct和public
{
    void Stop();
    void Run();
    void Fill();

}

//在C#中纯抽象类就是接口
//abstract class VehicleBase
//{
//    abstract public void Stop();
//    abstract public void Fill();
//    abstract public void Run();
//}

abstract class Vehicle:IVehicleBase
{
    public void Stop()
    {
        Console.WriteLine("Stopped.");
    }

    public void Fill()
    {
        Console.WriteLine("Pay and fill");
    }

    //public virtual void Run()
    //{
    //    Console.WriteLine("Vehicle is running");
    //}

    public abstract void Run();
}

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

}

class Truck:Vehicle
{
    public override void Run()
    {
        Console.WriteLine("Truck is rumming.");
    }

}

class RaceCar : Vehicle
{
    public override void Run()
    {
        Console.WriteLine("RacCar is running.");
    }
}
//Engine与Car紧耦合,然后Engine出现Bug那么Car也会受阻。假设十人团队中有九个人的代码紧耦合了剩下的一个人,当他的代码出现问题,那么九个人的工作都会受阻。
class Program
{
    static void Main(string[] args)
    {
        var engine = new Engine();
        var car = new Car(engine);
        car.Run(3);
        Console.WriteLine(car.Speed);
    }

}

class Engine
{
    public int RPM { get; private set; }
    public void Work(int gas)
    {
        this.RPM = 1000 * gas;
    }
}

class Car
{
    private Engine _engine;
    public Car(Engine engine)
    {
        _engine = engine;
    }

    public int Speed { get; private set; }
    public void Run(int gas)
    {
        _engine.Work(gas);
        this.Speed = _engine.RPM / 100;
    }
}
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值