You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#公共属性应声明在接口还是基类?Blazor开发标准实践问询

方案选择建议

先明确你给出的两段代码首先存在小问题需要修正:

  • 代码1中定义的接口名为IBase,但Company类实现的是不存在的IBaseEntity,命名不统一
  • 代码2中BaseClass的两个属性没有加public访问修饰符,默认私有,子类无法访问,且属性名ID和子类的Id大小写不匹配,会被识别为两个不同属性

下面分场景给出C#的标准实现规范:

优先用接口的场景

  • 你的Company/Project/User类已经有其他父类(比如Blazor中部分自定义组件需要继承ComponentBase,C#不支持多类继承,用接口不会占用继承位)
  • 你只需要约定类的结构,不需要共享Id/Name的实现逻辑,比如不同类的Id生成规则不同、Name校验规则不同
  • 你需要用该约束做泛型参数限制,比如写Blazor通用下拉组件、列表渲染组件时,只要实体实现了对应接口就能作为参数传入,兼容所有符合结构的类,灵活度更高
  • 需要对实体做单元测试Mock,接口的Mock成本远低于基类

优先用基类的场景

  • 三个类都是纯业务实体类,没有其他父类,不存在多继承冲突
  • Id/Name/CreatedAt这类属性的逻辑可以完全共享,比如所有实体的Id默认都是新建Guid、CreatedAt默认是实例化时间,把这部分逻辑抽到基类可以避免每个子类重复写相同代码
  • 后续要新增通用字段/方法(比如UpdatedAt、软删除标记IsDeleted),只需要修改基类就能同步到所有子类,维护成本更低

Blazor场景的常用最佳实践

两种方案可以结合使用:定义IBaseEntity接口约定Id/Name结构,同时写BaseEntity基类实现该接口,把通用逻辑放到基类中。既可以用接口做泛型约束兼容所有符合结构的类,又能让普通业务实体继承基类减少重复代码,兼顾灵活度和复用性。


内容的提问来源于stack exchange,提问作者Visal Rajapakse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:24:10