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

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以下的版本,你可以用标记接口+扩展方法的方式省掉转发代码:

  1. 先定义一个空的标记接口IFooPage
  2. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:24:05