首页 > 编程语言 >刘铁猛C#学习笔记19 抽象类、接口与SOLID五大原则

刘铁猛C#学习笔记19 抽象类、接口与SOLID五大原则

时间:2024-02-23 23:36:57浏览次数:30  
标签:刘铁猛 SOLID 子类 接口 C# 抽象 抽象类 方法 实现

接口与抽象类是所有高阶面向对象的起点,是学习设计模式的前置条件 必须有实践基础之后,才能真正掌握算法、设计模式   设计模式的基础

solid五大设计原则(待续)

1.单一职责原则

single responsibility principle

2.开放-关闭原则

Open-close principle,简称为开闭原则 “封装确定的,开放不确定的,不确定的推迟到合适的子类中去实现”

3.替换原则

4.接口隔离原则

详见学习笔记20

5.依赖反转原则

(Dependency inversion principle,简称DIP) 使得高层次的模块(功能调用者)不依赖于低层次的模块(功能提供者)的实现细节, 依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象 从调用者依赖提供者的功能,转换为提供者依赖调用者给出的需求

抽象类abstract

概念定义

抽象类指“成员没有被完全实现的类” 如下这样,在声明类时abstract修饰符 包含用abstract修饰的成员方法没有方法体(称作未被实现) 这样的抽象方法不能是private的,因为实现这个方法的一定是抽象类的子类 一旦被abstract修饰,就不能有任何的逻辑实现,大括号都没有 抽象方法在C++中也称作“纯虚函数抽象类不能被实例化  

抽象类两大功能

1.作为基类去派生出子类

2.声明变量去装子类实例

 

实例程序讲解

声明一个小汽车类、卡车类,发现二者的Stop方法完全一致 违反了“不能复制粘贴原则”,出现了未能复用的完全相同代码   于是为他们建立一个基类,使用虚方法重写、多态来复用代码 但发现一个问题,父类的虚方法的方法体,似乎永远不会被用到 干脆不写虚方法的方法体,让他变成“纯虚方法”,在C#中就是抽象方法 但抽象方法所在的类也必须加修饰符变成抽象类   这样添加新子类时不用动父类代码,符合开闭原则 在继承自抽象父类的子类声明时,会划红线 提示是否在此继承层级进行抽象方法的实现 若不实现,则此子类也必须写为抽象类 抽象方法实现时必须被重写(写上override修饰符) 抽象类就是专为作基类而生的   有没有一种可能,一个类中所有成员都是抽象成员 “非常抽象的抽象类”、“纯抽象类” fill、stop方法在vechicle一级实现,run方法在再下一级实现 这种“纯抽象类”在C#中就是 接口interface

接口interface

使用关键字interface将原本的类标识为接口 因为纯抽象类的成员一定是公开的、抽象的,所以之前写的abstract、public修饰符可以去掉 在实现抽象方法时,重写修饰符override也应该去掉

未实现方法的向下传递

需要在此层级类中写上完整抽象方法声明,将该方法的实现在继承链上往下推 因为是用抽象方法向下传递的,到再下一层时此方法来自一个抽象类,而非完整的接口 所以在接口的下下层要实现该方法时需要写上重写override修饰符  

接口命名规范

接口命名时,在单词前写上字母"I"表接口interface    

小结

抽象类、接口是软件工程实践的产物,是为了提高工程质量总结出的 抽象类是 未完全实现成员 的类 接口(纯抽象类)是 完全未实现成员 的类 抽象类是为复用、作为基类而生 接口的为解耦而生(待续)  

标签:刘铁猛,SOLID,子类,接口,C#,抽象,抽象类,方法,实现
From: https://www.cnblogs.com/jk-2048/p/18030569

相关文章

  • 刘铁猛C#学习笔记21 反射与依赖注入
    反射对于一个现有对象,能够在不使用new操作符、不知道其具体静态类型的情况下,创建出一个同类型的对象,还能访问这个复制品对象拥有的各个成员。相当于进一步的解耦,可以不使用new操作符,就没有类型的依赖关系这样的耦合关系甚至可以弱到忽略不计反射在.NET和JAVA中非常重要 ......
  • C#数据结构 字典Dictionary
    简介字典是C#开发中经常使用的一种键值对容器,类似C++的map,可使用foreach或迭代器遍历不能装多个相同key,底层实现是哈希函数具体用法1.创建Dictionary<key,value>//Key和Value可以是任意类型Dictionary<int,string>_testDic=newDictionary<int,string>();2.添加......
  • 刘铁猛C#学习笔记13 委托1
    “幻想:如果能有一种能把方法当参数的方法就好了”一、什么是委托委托源自C、C++中的函数指针 1.C语言中的函数指针(1)函数的直接调用先准备好一个加法函数,一个减法函数可以通过函数名调用这两个函数,这种调用方法称作直接调用 (2)函数指针的声明、间接调用先按下......
  • C++ 令人无语/好用的语法合集
    此贴用来总结一些傻逼C++语法,或者坑了我很久的写法。1、(坑)重载>,<,==时,千万不要使用pair为基的typedef!!!!!!pii的max不受你的重载影响,它自己有自己的max,然后typedef和define是相同的,基本可以看做直接替换,不会对作用域/命名做区分。2、(坑)lower_bound(..,..,{x......
  • containerd环境搭建指南
    目录一.container概述1.什么是containerd2.为什么要学习containerd二.基于yum方式安装containerd1.获取软件源2.查看yum源中containerd软件版本3.安装containerd的4.查看containerd的版本信息5.设置containerd开机自启动6.查看containerd的客户端和服务端的版本信息三.基于二进制......
  • SciTech-EECS-PCB电路板设计-使用KiCad进行PCB设计的基本流程
    使用KiCad进行PCB设计的基本流程,2024-02-2314:04KiCad是一款强大的开源PCB设计软件,其设计的大体流程包括:原理图设计及导出网表文件,PCB布局和布线,导出Gerber文件及制板;以下是使用KiCad进行PCB设计的基本步骤:0.安装KiCad:首先,你需要安装KiCad软件。KiCad官方网站下载......
  • 刘铁猛C#学习笔记10 字段、属性
    这四种东西都是用来表达数据的一、字段(成员变量)曾用名:成员变量是为一个对象或类型存储数据的变量,区别于方法体中的局部变量多个字段组合起来可以表示对象当前的状态起源:C语言中结构体的成员变量一个对象占用的内存空间会被分配给各个字段1.实例字段和静态字段可以分为......
  • 刘铁猛C#学习笔记11 索引器、常量
    一、索引器[]概述使一个对象可以像数组一样用方括号[]去访问其元素ex:字典的声明 1.索引器的声明首先像上文那样声明一个字典Dictionary<,>在VS中输入indexer,然后敲两下tab就能得到:(按下tab可以跳到下一个可编辑项上)第一个类型参数为返回值的类型,第二个类型参数为......
  • 刘铁猛C#学习笔记12 参数种类详解
    一、值参数(传值参数、值传递)指参数的种类为值参数,而非参数数据类型为值类型1.值类型的传值参数类似一个新声明的局部变量,或传进来的实参的一个副本可以在方法体内重现赋值,但其在方法体内被赋值时,不会影响传进来的本体 2.引用类型的传值参数引用类型变量存储的是实例......
  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......