【笔记】C#的面向对象

前言

C#的面向对象学习笔记

定义类

  • 类名为大坨峰命名
1
2
3
4
5
6
7
8
9
public class 类名
{
public 数据类型 属性名 { get; set; }

public 返回值数据类型 方法名(形参列表)
{
...
}
}

定义静态属性

  • 静态属性只能通过类名调用
1
2
3
4
public class 类名
{
public static 数据类型 属性名 { get; set; }
}
1
类名.属性名;

定义静态方法

  • 静态方法只能通过类名调用
1
2
3
4
5
6
7
public class 类名
{
public static 返回值数据类型 方法名(形参列表)
{
...
}
}
1
类名.方法名(实参列表);

定义静态类

  • 如果类中存在扩展方法时,必须使用静态类
  • 如果类中没有存在扩展方法,无需使用静态类
1
2
3
4
public static class 类名
{
...
}

创建对象

1
类名 对象名 = new 类名();

创建对象时直接实例化

1
2
3
4
5
类名 对象名 = new 类名()
{
属性名 = 值,
属性名 = 值
}

获取属性值

1
对象名.属性名;

修改属性值

1
对象名.属性名 = 值;

调用方法

1
对象名.方法名(实参列表);

权限修饰符

权限修饰符 本文件可访问 本项目可访问 子类可访问 其他项目可访问
public
internal ×
protected × ×
private × × ×

定义构造方法

  • 构造方法与类名同名
  • 构造方法没有返回值,也不需要定义返回值类型
1
2
3
4
5
6
7
class 类名
{
public 类名()
{
...
}
}

通过自定义构造方法创建对象

1
2
3
4
5
6
7
class 类名
{
public 类名(数据类型 形参名)
{
...
}
}
1
类名 对象名 = new 类名(实参名);

静态类和扩展方法

  • 方法的形参中如果使用this进行修饰,则该方法就是扩展方法,必须使用静态类

  • this修饰的形参可以通过对应数据类型的对象直接调用扩展方法

  • 定义静态类和扩展方法

1
2
3
4
5
6
7
8
9
10
static class 类名
{
public static 数据类型 扩展方法名(this 数据类型 形参名)
{

...

return 形参名;
}
}
  • 调用扩展方法
1
2
数据类型 变量名 = "";
变量名.扩展方法名();

继承

  • C#中只能继承一个类

所有类的父类

  • object类是所有类的父类
1
2
3
4
public class 类名 : object
{
...
}

定义子类继承父类

1
2
3
4
5
6
7
8
9
public class 父类名
{
...
}

public class 子类名 : 父类名
{
...
}

子类继承父类构造方法

  • 如果父类中定义了自定义的构造方法,则子类也必须定义相应的自定义构造方法
  • 通过base()可以将子类构造方法的参数传递给父类构造方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class 父类名
{
public 父类名(数据类型 父类参数名)
{
...
}
}

public class 子类名 : 父类名
{
public 子类名(数据类型 子类参数名) : base(子类参数名)
{
...
}
}

里氏替换原则

1
父类名 父类对象名 = new 子类名();
  • 在里氏替换原则下,不能使用父类对象调用子类定义的额外的属性和方法,需要强制转换为子类后才能调用子类定义的额外的属性和方法
  • 如果子类中出现了与父类同名的属性,则在经过里氏替换原则后得到的父类对象中,调用的属性得到的值仍然是父类定义的值,而不是子类定义的值,子类定义的值会被隐藏,需要强制转换为子类后才能调用子类被隐藏的值
  • 如果子类中出现了与父类同名的方法,则在经过里氏替换原则后调用这个方法时,执行的是子类定义的方法

强制类型转换

  • 通过在对象前添加()前缀进行强制类型转换,如果转换失败会报错
1
子类名 子类名对象名 = (子类名)父类对象名;
  • 也可以通过as进行强制类型转换,如果转换失败会返回null值
1
子类名 子类名对象名 = 父类对象名 as 子类名;

接口

  • C#中可以实现多个接口
  • C#中的接口可以只有方法的声明,也可以有方法的实现

定义接口

  • 接口文件名通常以I作为前缀
1
2
3
4
public interface 接口名
{
...
}

定义实现类

  • 实现类必须实现所有接口中定义但未实现的方法,包括属性的get方法和set方法
1
2
3
4
public class 类名 : 接口名
{
...
}

实现多个接口

1
2
3
4
public class 类名 : 接口名1, 接口名2
{
...
}

部分类

  • 多个部分类中属性和方法是互通的,相当于一个类分为了多个文件
  • 同一命名空间内的多个相同类名的部分类表示同一个类
1
2
3
4
5
6
7
8
9
public part class 类名
{
...
}

public part class 类名
{
...
}

完成

参考文献

哔哩哔哩——朝夕教育
哔哩哔哩——全栈ACE