C#中不同基类的多类如何优雅实现通用功能复用与继承?
可行的优化方案有3种,你可以根据项目实际情况选择:
方案1:C# 8.0+ 默认接口实现(最接近多继承需求,无冗余代码)
因为你的APage/BPage/CPage都继承自BasePage,你可以把Foo的通用逻辑抽成带默认实现的接口,并且给接口加基类约束,这样默认实现里可以直接访问BasePage的公共成员(比如Driver),三个FooPage只需要继承各自的服务基类,再实现这个接口即可,完全不需要写转发方法。
示例代码:
// 带约束的通用接口 public interface IFoo { void DoThingOne() { // 因为所有实现类都继承自BasePage,可直接转换获取Driver等公共属性 var driver = (this as BasePage).Driver; // 原有Foo类的业务逻辑 } void DoThingTwo() { // 原有Foo类的业务逻辑 } }
FooPage实现仅需继承对应服务基类+实现接口即可:
public class FooPage : APage, IFoo { public FooPage(IWebDriver driver) : base(driver) { // 不需要任何额外的转发代码,IFoo的默认实现自动生效 } }
方案2:扩展方法(兼容C#低版本)
如果你们项目还在使用C# 8以下的版本,你可以用标记接口+扩展方法的方式省掉转发代码:
- 先定义一个空的标记接口
IFooPage - 给
IFooPage写扩展方法,约束实现类必须继承自BasePage
示例代码:
// 空标记接口,仅用于标识属于Foo系列页面 public interface IFooPage {} // 通用逻辑封装为扩展方法 public static class FooPageExtensions { public static void DoThingOne(this T page) where T : BasePage, IFooPage { var driver = page.Driver; // 原有Foo类的业务逻辑 } public static void DoThingTwo(this T page) where T : BasePage, IFooPage { // 原有Foo类的业务逻辑 } }
FooPage实现:
public class FooPage : APage, IFooPage { public FooPage(IWebDriver driver) : base(driver) {} // 不需要写任何转发方法,直接可以调用page.DoThingOne() }
方案3:保留现有组合方案
你现在用的组合+转发的方案其实维护成本并不高:
- Foo的通用逻辑只需要修改一处,不存在重复代码
- 转发代码可以用IDE的生成委托方法功能一键生成,不需要手写
- 逻辑最清晰,没有语法门槛,所有团队成员都能快速看懂
- 没有C#版本限制,封装性最好,Foo的内部状态和私有方法不会对外暴露
如果Foo的方法数量不多(少于20个),完全可以保留现有方案,后续维护不会有额外负担。
内容的提问来源于stack exchange,提问作者Kieran Moynihan
相关产品推荐
相关产品推荐

