@作者 : SYFStrive
@博客首页 : HomePage
📜: C#面向对象
📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗
📌:觉得文章不错可以点点关注 👉:UnityC#编程干货🔗
目录
提示:以下是本篇文章正文内容
面向对象的三大特性
- 封装 : 用程序语言来形容对象
- 继承 :复用封装对象的代码;儿子继承父亲,复用现成代码
- 多态:同样行为的不同表现,儿子继承父亲基因但是有不同的行为表现
面向对象的七大原则
① 单一职责原则(Single Responsibility Principle)
👉单一职责原则又称单一功能原则,它规定一个类应该只有一个发生变化的原因。
② 里氏替换原则(Liskov Substitution Principle)
👉氏替换原则的意思是,所有基类在的地方,都可以换成子类,程序还可以正常运行。这个原则是与面向对象语言的继承特性密切相关的。
③ 依赖倒置原则(Dependence Inversion Principle)
👉程序要依赖于抽象接口,不要依赖于具体实现
④ 接口隔离原则(Interface Segregation Principle)
👉客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
⑤ 迪米特法则(Law Of Demeter)
👉迪米特法则又叫作最少知识原则,一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。
⑥ 开闭原则(Open Close Principle)
👉软件实现应该对扩展开放,对修改关闭,其含义是说一个软件应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化的。
⑥ 组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)
👉组合/聚合复用原则是通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。
封装✔
类和对象基本概念
- 一般在namespace中声明
- 具相同特征,相同行为,一类事物的抽象,类是对象的模板,可以通过类创建对象。
- 声明类的关键词:Class
- 类的声明 和 类对象声明是两个概念
- 类的声明: 👉 类(类是少的数引用类型)似枚举和结构体(值类型) 的声明 👉 类的声明相当于是声明了一个自定义的变量类型,用来抽象现实实物的
- 类对象的声明: 👉 相当于声明一个指定类的变量
- 对象是类创建出来的 是用来表象现实中的对象个体
- 类创建对象的过程 👉 称之为实例化对象
- 类、对象都是引用类型的
- null :空引用类型为null的时候指的是内存堆没有分配
类声明的语法
- 声明类类名使用 👉 怕斯卡命名法(简单理解首字母大写)
- 相关语法如 👇:
class 类名
{
//特征 👉 成员变量
//行为 👉 成员方法
//保护特征 👉 成员属性
//构造函数 和 析构函数
//索引器
//运算符重载
//静态成员
ヾ(@⌒ー⌒@)ノ……
}
类实例化相关语法
// 引用类型
//类名 变量名; (栈指向堆地址值是空的没有分配堆内存)
//类名 变量名 = null; (栈指向堆地址值是空的没有分配堆内存)
//类名 变量名 = new 类名; (存在栈指向堆的内存空间使其在堆中新开了个房间(这时是空的))
// 使用new时(相当于开辟一个新的空间):相当于创建一个新对象
面向对象 👉 new……;
类成员变量和访问修饰符
- 成员变量特点如 👇:
- 用于描述对象的特征
- 可以是任意变量类型(枚举,结构体,类对象)
- 是否初始化根据需求而定
- 声音一个Person类 如 👇
class Person
{
public string name;
public int age;
public E_Sex sex;
public Person[] boyFriend; (类名一样的变量类型 👉 初始值为空)
public Position Pos;(Position结构体)
注意:如果要声明一个和自己相同类型的成员变量时,不能对他进行实例化/或设置为空(会死循环!!)
……
}
- 三个访问修饰符
- public: 公开的,所有对象都能访问和使用
- private: 私有的,只有自己内部才能访问和使用, 变量前不写默认为该状态
- protected: 只有自己内部和子类才能访问和使用,继承的时候用到
class Person
{
public int a;
private int b;
protected int c;
}
-
检查默认值
- Default()
成员方法
- 和结构体中函数的声明使用差不多
- 用来描述对象的行为,在类中声明
- 受访问修饰符的影响
- 不需要加static关键字
- 成员方法需要实例化才能使用
class Person
{
//特征——成员变量
public bool sex;
public string nanme;
public float height;
public int age;
public Person[] friend;
/// <summary>
/// 添加朋友扩容数组
/// </summary>
/// <param name="p">添加朋友P</param>
public void AddFriend(Person p)
{
if (friend ==null)
{
friend = new Person[] { p };
}
else
{
//数组扩容+1
Person[] newFriend = new Person[friend.Length + 1];
for (int i = 0; i < friend.Length; i++)
{
newFriend[i] = friend[i];
}
//将新成员p存在新数组的最后一个索引
newFriend[newFriend.Length - 1] = p;
}
}
}
构造函数
- 在实例化对象时会调用的用于初始化的函数,如果不写就默认存在一个无参构造函数
- 和结构体中构造函数的写法一致,(类允许自己申明一个无参构造函数 结构体是不允许的)
- 无返回值,函数名和类名必须相同,一般都是public,可以重载构造函数
- 声明有参构造函数之前最好一起声明一个无参构造函数,声明有参构造时默认的无参构造就不存在了,要手动声明
class Person
{
//特征——成员变量
public string nanme;
public float height;
public int age;
public Person[] friend;
//构造函数 实现对象实例化时 初始化
//构造函数可以重载
//无参构造函数
public Person()
{
nanme = "郭先生";
age = 18;
0 = true;
height = 180;
}
//有参构造函数
public Person(string name, int age,float height) :this()
{
this.name = name;
this.age = age;
this.height = height;
}
}
Person p = new Person("郭先生"",18,120f);