【笔记】C#的面向对象
前言
C#的面向对象学习笔记
定义类
- 类名为大坨峰命名
1 | public class 类名 |
定义静态属性
- 静态属性只能通过类名调用
1 | public class 类名 |
1 | 类名.属性名; |
定义静态方法
- 静态方法只能通过类名调用
1 | public class 类名 |
1 | 类名.方法名(实参列表); |
定义静态类
- 如果类中存在扩展方法时,必须使用静态类
- 如果类中没有存在扩展方法,无需使用静态类
1 | public static class 类名 |
创建对象
1 | 类名 对象名 = new 类名(); |
创建对象时直接实例化
1 | 类名 对象名 = new 类名() |
获取属性值
1 | 对象名.属性名; |
修改属性值
1 | 对象名.属性名 = 值; |
调用方法
1 | 对象名.方法名(实参列表); |
权限修饰符
| 权限修饰符 | 本文件可访问 | 本项目可访问 | 子类可访问 | 其他项目可访问 |
|---|---|---|---|---|
public |
✓ | ✓ | ✓ | ✓ |
internal |
✓ | ✓ | ✓ | × |
protected |
✓ | ✓ | × | × |
private |
✓ | × | × | × |
定义构造方法
- 构造方法与类名同名
- 构造方法没有返回值,也不需要定义返回值类型
1 | class 类名 |
通过自定义构造方法创建对象
1 | class 类名 |
1 | 类名 对象名 = new 类名(实参名); |
静态类和扩展方法
方法的形参中如果使用
this进行修饰,则该方法就是扩展方法,必须使用静态类被
this修饰的形参可以通过对应数据类型的对象直接调用扩展方法定义静态类和扩展方法
1 | static class 类名 |
- 调用扩展方法
1 | 数据类型 变量名 = ""; |
继承
- C#中只能继承一个类
所有类的父类
object类是所有类的父类
1 | public class 类名 : object |
定义子类继承父类
1 | public class 父类名 |
子类继承父类构造方法
- 如果父类中定义了自定义的构造方法,则子类也必须定义相应的自定义构造方法
- 通过
base()可以将子类构造方法的参数传递给父类构造方法
1 | public class 父类名 |
里氏替换原则
1 | 父类名 父类对象名 = new 子类名(); |
- 在里氏替换原则下,不能使用父类对象调用子类定义的额外的属性和方法,需要强制转换为子类后才能调用子类定义的额外的属性和方法
- 如果子类中出现了与父类同名的属性,则在经过里氏替换原则后得到的父类对象中,调用的属性得到的值仍然是父类定义的值,而不是子类定义的值,子类定义的值会被隐藏,需要强制转换为子类后才能调用子类被隐藏的值
- 如果子类中出现了与父类同名的方法,则在经过里氏替换原则后调用这个方法时,执行的是子类定义的方法
强制类型转换
- 通过在对象前添加
()前缀进行强制类型转换,如果转换失败会报错
1 | 子类名 子类名对象名 = (子类名)父类对象名; |
- 也可以通过as进行强制类型转换,如果转换失败会返回null值
1 | 子类名 子类名对象名 = 父类对象名 as 子类名; |
接口
- C#中可以实现多个接口
- C#中的接口可以只有方法的声明,也可以有方法的实现
定义接口
- 接口文件名通常以
I作为前缀
1 | public interface 接口名 |
定义实现类
- 实现类必须实现所有接口中定义但未实现的方法,包括属性的get方法和set方法
1 | public class 类名 : 接口名 |
实现多个接口
1 | public class 类名 : 接口名1, 接口名2 |
部分类
- 多个部分类中属性和方法是互通的,相当于一个类分为了多个文件
- 同一命名空间内的多个相同类名的部分类表示同一个类
1 | public part class 类名 |