c# 中的抽象类、接口、密封类、虚方法介绍

时间:2022-08-16 05:37:11

1、抽象类

如果一个类没有具体的实现,只表现一种抽象概念,并且仅仅只作为自己派生类的一个基类出现,那么这样的类称作抽象类。抽象类中由abstract修饰的方法称之为抽象方法。

(1)抽象类声明和特点

抽象类的声明由:abstract  class + 类名称组成。

抽象类的特点

抽象类不能直接实例化

抽象类不能被密封

抽象类中可以有抽象方法和非抽象方法,抽象方法必须其派生类来实现,实现时必须用 override 来重载,抽象类中的抽象方法不能用virtual、static、private 来修饰

(2)抽象类的作用

抽象类是一种高度的概括,因为他必须靠其派生类来实现,所以抽象类更方便我们扩展。

(3)实例通过抽象类和抽象方法来实现数据库的最基本操作

  public abstract class ABaseRepository<T> where T : class,new()
{
/// <summary>
/// 是否存在该记录
/// </summary>
/// <param name="where">查询条件</param>
/// <returns></returns>
public abstract bool Exists(string where);

/// <summary>
/// 增加
/// </summary>
/// <param name="model">实体</param>
/// <returns></returns>
public abstract bool AddModel(T model);

/// <summary>
/// 删除
/// </summary>
/// <param name="model">实体</param>
/// <returns></returns>
public abstract bool DeleteModel(T model);

/// <summary>
/// 批量删除
/// </summary>
/// <param name="where">条件</param>
/// <returns></returns>
public abstract bool DeleteModels(string where);

/// <summary>
/// 修改
/// </summary>
/// <param name="model">实体</param>
/// <returns></returns>
public abstract bool UpdateModel(T model);

/// <summary>
/// 查询
/// </summary>
/// <param name="where">查询条件</param>
/// <returns></returns>
public abstract DataSet LoadModels(string where);

/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">页条数</param>
/// <param name="pageIndex">当前页</param>
/// <param name="totalCount">总条数</param>
/// <param name="where">条件</param>
/// <param name="orderBy">排序</param>
/// <returns></returns>
public abstract DataSet LoadPageModels(int pageSize, int pageIndex, out int totalCount, string where, string orderBy);
}

2、接口
接口是一种行为规范,是一种协定,是对象与对象之间的一种约束

(1)接口的声明和特点

接口的声明:接口的申明和抽象类很像只是关键字换做 interface ,interface + 接口名称

特点:

接口的最大特点是可以实现多继承而类只能实现单一继承,一个接口可以继承多个接口。

接口类似于抽象基类不能被实例化,必须有其派生的子类去实现。

接口不能包含常量、字段、运算符、实例构造函数、析构函数、类型、不能包含静态成员。

接口中成员不能用new、public、protected、internal、private、static、abstract、override、virtual 修饰符修饰

(2)接口作用

实现多继承,提供约束条件方便管理

(3)实例

public interface IBaseRepository<T> where T : class,new()
{
/// <summary>
/// 是否存在该记录
/// </summary>
/// <param name="where">查询条件</param>
/// <returns></returns>
bool Exists(string where);

/// <summary>
/// 增加
/// </summary>
/// <param name="model">实体</param>
/// <returns></returns>
bool AddModel(T model);

/// <summary>
/// 删除
/// </summary>
/// <param name="model">实体</param>
/// <returns></returns>
bool DeleteModel(T model);

/// <summary>
/// 批量删除
/// </summary>
/// <param name="where">条件</param>
/// <returns></returns>
bool DeleteModels(string where);

/// <summary>
/// 修改
/// </summary>
/// <param name="model">实体</param>
/// <returns></returns>
bool UpdateModel(T model);

/// <summary>
/// 查询
/// </summary>
/// <param name="where">查询条件</param>
/// <returns></returns>
DataSet LoadModels(string where);

/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">页条数</param>
/// <param name="pageIndex">当前页</param>
/// <param name="totalCount">总条数</param>
/// <param name="where">条件</param>
/// <param name="orderBy">排序</param>
/// <returns></returns>
DataSet LoadPageModels(int pageSize, int pageIndex, out int totalCount, string where, string orderBy);
}

3、密封类

密封类是一种不可以派生的类,密封类不能用作基类,由sealed 修饰的方法称之为密封方法

(1)密封类的声明和特点

密封类的声明:sealed class + 类名称

特点:

不可派生

密封类中的方法不能用virtual 、abstract来修饰

(2)密封类的作用

防止类被继承

(3)举例

        public sealed class myClass     //声明密封类  
{

public void method()
{
Console.WriteLine("这是个密封类");
}
}

4、虚方法

如果一个方法包含virtual 修饰符称之为虚方法,没有的话称之为非虚方法(msdn)

(1)虚方法的声明和特点

虚方法的声明:virtual +void + 方法名

虚方法的特点:

派生类可以通过override 来重载但不是必须的(注:抽象方法必须通过该类来重载)

虚方法可以直接使用和通常方法一样

(2)虚方法的作用

实现面向对象的一大要素多态。

(3)实例

    public class Pet
{
public virtual void Dog()
{
Console.WriteLine("汪汪");
}
}
public class DogPet : Pet
{

public override void Dog()
{

Console.WriteLine("旺旺");
}
}
public class Program
{
public static void Main(string[] args)
{
var dogpet = new DogPet();
dogpet.Dog();
}
}


输出结果:旺旺