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

发布于:2024-03-19 ⋅ 阅读:(63) ⋅ 点赞:(0)

【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;
    }
}
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到