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
相关产品推荐
相关产品推荐

