一、抽象
用 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);
}