当前位置: 首页 > wzjs >正文

广州网站搭建费用郑州网站建设贴吧

广州网站搭建费用,郑州网站建设贴吧,网站域名怎么查,做任务 网站抽象类 (abstract class): 不能直接实例化,只能被继承。 用来定义一套基础框架和规范,强制子类必须实现某些方法(抽象方法)。 可用来封装一些共通的逻辑,减少代码重复。 虚方法 (virtual): …

抽象类 (abstract class):

  • 不能直接实例化,只能被继承。

  • 用来定义一套基础框架和规范,强制子类必须实现某些方法(抽象方法)。

  • 可用来封装一些共通的逻辑,减少代码重复。

虚方法 (virtual):

  • 表示这个方法可以被子类重写(override)

  • 默认给了一套实现,你可以用,也可以替换掉

  • 避免了子类必须每次都写重复代码(子类用基类实现就好)

总结:

抽象类 + 虚方法组合使用的好处是:

  • 提供一个统一的接口和逻辑框架

  • 允许子类在不破坏主结构的情况下实现个性化逻辑(比如加缓存、记录日志)

🔗 组合使用的优势

抽象类 + 虚方法
✅ 定义统一规范和基础结构
✅ 提供默认逻辑(虚方法)
✅ 允许子类按需定制(重写虚方法)
✅ 提高代码复用性、可维护性
✅ 非侵入式扩展逻辑(如:记录日志、缓存等)

 🔧 举个实际应用场景(例如仓储):

public abstract class BaseRepository<T>
{public virtual void Add(T entity){// 默认实现:记录日志 + 保存Console.WriteLine("添加前记录日志");Save(entity);}protected abstract void Save(T entity); // 强制子类必须实现
}
public class UserRepository : BaseRepository<User>
{protected override void Save(User entity){// 实现具体的保存逻辑Console.WriteLine("保存用户到数据库");}public override void Add(User entity){// 也可以选择重写 Add,增加缓存逻辑等base.Add(entity);Console.WriteLine("添加用户成功");}
}

✅ 示例代码:调用 UserRepository

public class Program
{public static void Main(string[] args){var userRepo = new UserRepository();var newUser = new User { Id = 1, Name = "张三" };userRepo.Add(newUser);/* 日志打印结果添加前记录日志保存用户到数据库添加用户成功*/}
}// 假设 User 类如下:
public class User
{public int Id { get; set; }public string Name { get; set; }
}

🎯 实战目标

构建一个 基于接口 + 抽象类 + 泛型 的通用仓储:

  • 支持常规操作(增删改查)

  • 支持扩展方法(如分页、条件查询)

  • 易于继承 & 复用


🧩 步骤一:定义接口 IRepository<T>

public interface IRepository<T> where T : class
{Task<T> GetByIdAsync(int id);Task<IEnumerable<T>> GetAllAsync();Task AddAsync(T entity);void Update(T entity);void Delete(T entity);
}

🧱 步骤二:实现抽象类 BaseRepository<T>

以 EF Core 为例,注入 DbContext

public abstract class BaseRepository<T> : IRepository<T> where T : class
{protected readonly DbContext _context;protected readonly DbSet<T> _dbSet;public BaseRepository(DbContext context){_context = context;_dbSet = _context.Set<T>();}public virtual async Task<T> GetByIdAsync(int id){return await _dbSet.FindAsync(id);}public virtual async Task<IEnumerable<T>> GetAllAsync(){return await _dbSet.ToListAsync();}public virtual async Task AddAsync(T entity){await _dbSet.AddAsync(entity);}public virtual void Update(T entity){_dbSet.Update(entity);}public virtual void Delete(T entity){_dbSet.Remove(entity);}
}

🧪 步骤三:创建具体仓储类 UserRepository

public class UserRepository : BaseRepository<User>
{public UserRepository(MyDbContext context) : base(context){}// 可扩展自定义方法public async Task<User?> GetByEmailAsync(string email){return await _dbSet.FirstOrDefaultAsync(u => u.Email == email);}
}

🧩 步骤四:在服务中使用

public class UserService
{private readonly UserRepository _userRepo;public UserService(UserRepository userRepo){_userRepo = userRepo;}public async Task RegisterUser(User user){await _userRepo.AddAsync(user);// 保存到数据库由 UnitOfWork 或 DbContext 控制}
}

✅ 什么时候用接口 vs 抽象类?

特性接口(interface)抽象类(abstract class)
目的定义行为规范定义基本结构和部分实现
支持多继承✅ 支持❌ 不支持
可包含字段❌ 不行✅ 可以
可有构造函数❌ 不行✅ 可以
成员默认类型抽象(abstract)可以是抽象,也可以有默认实现
是否可实例化❌ 不行❌ 不行

仅供学习参考,

http://www.dtcms.com/wzjs/795811.html

相关文章:

  • 网站报备流程安徽工程建设信息网官网
  • 中国建筑设计咨询公司江门seo全网营销
  • 公司网站源码网站打开很慢怎么回事啊
  • 怎么做单位网站网站页面关键词都一样
  • 网站接单做一小说网站要花多钱
  • 郑州的建设网站有哪些手续费海南省住建设厅网站报监
  • 网站建设指南 菜鸟教程系统开发费用明细
  • 买房网站怎么做镇江市建设工程安全监督站网站
  • 营销网站建设教学电商网站建设心得体会
  • 楚雄市网站建设公司ftp两个网站子域名的绑定
  • 杭州 城西 做网站网站后台超链接怎么做
  • 比较好的网站建设哪家好建设银行网站显示404
  • 广州企业网站设计方案网上订酒店 网站开发
  • 网站内链检测扬中王老大
  • 做网站用到什么开发语言怎么做文学动漫网站
  • 公司网站用服务器建站最好的
  • 无锡科技网站建设棋牌app开发公司
  • 无备案网站微信百度推广优化怎么做
  • 学生做网站的目的怎么做阿里巴巴英文网站
  • 新手织梦网建设网站网站免费模板制作
  • 广州网站设计 信科网络做rom的网站
  • 绿色能源网站模板网站建设 中企动力烟台
  • 拖拽式建站源码建设银行考试报名网站
  • 舟山市普陀区建设局网站有源代码怎么生成网页
  • 郑州网站优化哪家专业友情链接发布平台
  • 建设网站需要懂什么意思艺客网站首页
  • 烟台开发区建设局网站做好的网站怎么优化
  • 深圳网站建设补助建设企业网站前市场分析
  • 大学哪个专业可以做网站企业网站建设方案书 范本
  • 企业网站.net信息流广告形式主要有