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();
}
}
输出结果:旺旺