zoukankan      html  css  js  c++  java
  • 接口和抽象类

    接口和抽象类是面向对象中最精妙的部分。软件设计工业的两块基石。

    solid设计原则,算法,设计模式

    solid不是一个设计原则,而是5个面向对象设计原则的首字母的缩写,以下是这五个原则:

    • Single Responsibility Principle//单一职能原则(SRP)
    • Open Closed Priinciple//开放关闭原则(OCP)
    • Liskov Substitution Principle/替换原则(LSP)
    • Interface Segregation Principle //接口隔离原则(ISP)
    • Dependency Inversion Principle //依赖反转原则(DIP)

    这五个原则孕育出了几十种的设计模式,设计模式是这五个原则高阶用法。

    抽象类:函数成员没有被完全实现的一种类(他的方法体都不全),abstract类的成员不能是private,因为这样子类无法访问它。

    抽象类不能实例化,因为实例化之后的成员函数没有执行的逻辑,用处所在:1.作为基类,让派生类实现抽象的方法 (纯虚方法)2.可引用抽象类变量来引用基类的实例,多态的效果


    (Open Closed Principle)开闭原则:把一些稳定不变的成员封装,将一些不稳定的封装为抽象类型,让子类去实现


    接口包含了纯抽象类的含义:内部方法已经是abstract和public的

    • 具体类---->抽象类------->接口:越来越抽象,内部实现的东西越来越少
    • 抽象类是未完全实现的类(可以有字段和非public成员)他们代表了“具体逻辑”)
    • 抽象类为复用而生,(对于可以复用的,就去实现它,对于不能复用的声明为抽象方法,让继承的子类去实现)具有解耦功能。
    • 封装确定的,开放不确定的,推迟到子类中去实现
    • 接口是完全未实现的逻辑的“类”(“纯虚类”;只有函数成员;成员全部public);
    • 接口为解耦功能而生,“高内聚,低耦合‘,方便单元测试
    • 接口是一个”协约“,早已为工业生产所熟知(有分工必有协作,有协作必有协约)
    • 他们都不能实例化,只能用来声明变量,引用具体类的实例。
    class Program
        {
            static void Main(string[] args)
            {
                Vehicle v=new RaceCar();
                v.Run();
               
            }
        }
        interface  IVehicle {
           void Stop();
            void Fill();
             void Run();
        }
        abstract class Vehicle : IVehicle
        {                  
         public  void Stop()//可以复用的
            {
                Console.WriteLine("Stopped");
            }
         public  void Fill() {
             Console.WriteLine("Pay and fill...");
         }
         abstract public void Run();//没法复用的,使用抽象类声明为纯虚方法,让子类去实现
        }
       class RaceCar:Vehicle {
           public override void Run()
           {
               Console.WriteLine("RaceCar is running");
           }  
       }
        class Car:Vehicle
        {
            public override void Run()
            {
                Console.WriteLine("Car is running..");
            }       
        }
        class  Truck:Vehicle
        {
            public override void Run()
            {
                Console.WriteLine("Truck is running..");
            }
        }
  • 相关阅读:
    算法学习-顺序查找
    EF框架中Attach与Entry
    EntityFramework更新实体绑定实体字段简便方法
    C# 快速写入本地文件
    Vue 3.0初探
    二维管线生成三维管线,转换3DTiles 思路
    Civil3d中 如何用管轴线的变坡点桩号控制其他纵断面数据的显示?
    jupyter
    jenkins
    ambari
  • 原文地址:https://www.cnblogs.com/1521681359qqcom/p/11241755.html
Copyright © 2011-2022 走看看