一、抽象
用 abstract 关键字修饰的类叫抽象类,用 abstarct 修饰的方法叫抽象方法。
-
抽象类
-
用于归类有相同属性和方法的类(但是不同的类方法的实现方式不一样),比如:不同的领导都有相同的属性和方法,但是不同的领导处理事情的方式不一样
-
抽象类可以定义属性
-
可以有抽象方法(抽象方法必须在抽象类中)
-
抽象方法只有方法声明,没有方法体,继承该抽象类(接口)的非抽象子类必须 实现该抽象方法
-
-
可以有非抽象方法
-
抽象类能定义构造器,但是本身不能实例化,只能实例化该抽象类的实现类
-
抽象类中怎么确定方法需要用虚方法还是抽象方法?
-
当不需要用父类中的实现时,将其定义为抽象方法(实现类自己写自己的实现过程)
-
当实现类的方法和都一样,少数不一样时,将方法以虚方法形式写在父类,在少数不一样的过程中重写方法
-
-
public abstract class ClassName
{
public int age{get;set;}
public abstract int GetMaxNumber(int num1,int num2);
public int GetMinNumber(int num1, int num2)
{
return (num1 > num2 ? num2 : num2);
}
}
二、继承父类
-
用于方便有相同属性和方法的类(实现方式也相同,不同的话就要设计重写),比如:控制器中公共的方法放在一个基类控制器中
-
一个类只能有一个父类,C# 语言中继承 关系具有传递性,即 A 类继承 B 类、C 类继承 A 类,则 C 类也相当于继承了 B 类。
-
在.NET 6 中,子类中出现同方法名同参数名的情况下(参数不同),程序调用时会选择父类的方法。
-
在更前面的版本不同类会执行各自的方法,要调用父类的方法要用 base.FunctionName()
-
但是要直接使用父类的方法,最好用 base.FunctionName() ;
-
如果想重写方法,要在父类方法中将该名称的方法标注成 virturl ,然后在实现类中用 override 标注重写
-
-
三、接口
-
-
类之间只支持单继承,而接口是为了实现多重继承关系设计的
-
一个类可以同时多个接口,实现接口的同时还能继承其他类
-
接口也能继承接口
-
定义接口
-
接口名称一般用 I 开头,加上其他单词构成
-
不能使用修饰符
-
不能使用 public、private、protent、internal 访问修饰符 和 static、virtual、abstract、sealed 修饰符
-
-
接口中不能定义字段
-
接口中的方法不能包含方法体
-
接口中的默认访问类型是 public
-
interface IMyInterface { //属性 int age{get;set;} string name{get;set;} //方法 int MinNumber(int num1, int num2); int MaxNumber(int num1, int num2); }
-
接口不能直接创建而是要通过实现类创建实例
-
实现类实现接口时必须隐式或显式(不可使用修饰符,属性或方法前加上接口名)实现接口中的所有方法
//隐式实现接口 class DoInterfaceClass : IMyInterface { //类新增的属性 public string sex{get;set;} //隐式实现接口属性 public int age{get;set;} public string name{get;set;} //隐式实现接口方法 public int MinNumber(int num1, int num2) { return (num1 > num2 ? num2 :num1); } public int MaxNumber(int num1, int num2) { return (num1 > num2 ? num1 :num2); } } //显示实现接口 class DoInterfaceXSClass : IMyInterface { //类新增的属性 public string sex{get;set;} //显示实现接口属性 int IMyInterface.age{get;set;} string IMyInterface.name{get;set;} //显示实现接口方法 int IMyInterface.MinNumber(int num1, int num2) { return (num1 > num2 ? num2 :num1); } int IMyInterface.MaxNumber(int num1, int num2) { return (num1 > num2 ? num1 :num2); } }
-
如果不需要在继承类中完全实现接口方法,可以用抽象方法实现
//不完全实现接口 abctract class DoInterfaceAbstractClass : IMyInterface { //类新增的属性 public string sex{get;set;} public int age{get;set;} public string name{get;set;} public int MinNumber(int num1, int num2) { return (num1 > num2 ? num2 :num1); } public abstract int IMyInterface.MaxNumber(int num1, int num2); }
-