一、抽象

用 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);
}