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

为什么C#方法可返回抽象类?以Azure SDK的Response类为例

核心原理

这是面向对象多态特性的典型应用,抽象类本身无法直接实例化,但方法可以返回其非抽象子类的实例,调用方只需要依赖抽象父类定义的统一接口即可,不需要感知具体的实现类。

具体到Azure SDK的实现逻辑

  1. 你看到的元数据只展示了方法签名,没有暴露内部实现:BlobBaseClient的Delete虚方法已经有默认实现,内部会调用Azure.Core的底层HTTP处理逻辑,实际返回的是继承了Response的内部非抽象类实例,比如Azure.Core内部的HttpResponseEnvelope等类,这些类都实现了Response定义的所有抽象成员(Status、ReasonPhrase等)。
  2. 这些具体实现类被标记为internal,对用户不可见,微软这么设计的目的是:
  • 统一所有Azure服务的响应接口,降低开发者学习成本
  • 屏蔽实现细节,后续内部逻辑调整时只要Response的抽象接口不变,就不会影响用户已有代码,兼容性更好
  • 方便扩展,比如要新增日志、缓存等能力时,只需要新增Response的装饰器子类即可,对外无感知

最简复现示例

你自己开发类库时也可以用相同的设计:

// 对外公开的抽象响应类
public abstract class MyResponse
{
    public abstract int Code { get; }
}

// 内部实现类,不对外暴露
internal class MyHttpResponse : MyResponse
{
    public override int Code { get; }
    public MyHttpResponse(int code) => Code = code;
}

public class MyClient
{
    // 方法签名返回抽象类
    public MyResponse Delete()
    {
        // 实际返回子类实例
        return new MyHttpResponse(200);
    }
}

// 调用方代码,可正常使用
var client = new MyClient();
var res = client.Delete();
Console.WriteLine(res.Code); // 输出200

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 12:15:07