c# - 为什么 C# 方法会返回一个抽象类?
问题描述
我正在编写一个库和一个返回响应对象的库。我喜欢看一些例子,例如 MSFT 如何做到这一点。
我查看了返回 Azure.Response() 对象的 Azure BlobClient delete 方法,该对象本身被标记为抽象,但我可以像使用任何实例化对象一样使用 Response 对象。
var response = blobClient.Delete(...)
if(response.Status ==206)
{
etc
我不理解实现 - 这个删除方法(在 BlobClientBase 基类上是虚拟的,但似乎没有被 BlobClient 覆盖)返回一个抽象类。
问:如何实例化它以便我直接使用它?可能我在这里遗漏了一些 OO 理论 - 在此先感谢您的任何见解。
从 BlobClientBase 元数据...
public class BlobBaseClient
{
...
public virtual Response Delete(DeleteSnapshotsOption snapshotsOption = DeleteSnapshotsOption.None, BlobRequestConditions conditions = null, CancellationToken cancellationToken = default);
从 Azure.Storage.Blobs 元数据...
public class BlobClient : BlobBaseClient
响应的定义如下,我假设抽象意味着响应缺少一些实现(例如它自己的抽象属性和方法)。
从 Azure.Core 元数据......
public abstract class Response : IDisposable
{
protected Response();
public abstract int Status { get; }
public abstract string ReasonPhrase { get; }
public abstract Stream? ContentStream { get; set; }
public abstract string ClientRequestId { get; set; }
public virtual ResponseHeaders Headers { get; }
public static Response<T> FromValue<T>(T value, Response response);
public abstract void Dispose();
public override string ToString();
protected internal abstract bool ContainsHeader(string name);
protected internal abstract IEnumerable<HttpHeader> EnumerateHeaders();
protected internal abstract bool TryGetHeader(string name, [NotNullWhen(true)] out string? value);
protected internal abstract bool TryGetHeaderValues(string name, [NotNullWhen(true)] out IEnumerable<string>? values);
}
解决方案
抽象类Response
是方法的返回类型,而不是返回实例的类型。您可以将抽象类定义为返回类型,但您需要返回的是从抽象类继承的具体实现。
abstract class Abstract {}
class Concrete : Abstract {}
Abstract MyMethod() {
return new Concrete();
}
推荐阅读
- angular - 如何在自定义 Angular 组件中禁用 ngModel 的默认行为?
- python - 使用 Holoviews Holomap 绘制各天的堆积面积图
- node.js - [:^punct] 的 Postgresql 无效类
- laravel - Laravel Valet 共享错误:“dial tcp [...] no such host”
- php - spl_autoload_register 如何在内部工作
- javascript - 未捕获的类型错误:无法读取 select2 中 null 的属性“替换”
- android - 如何使用 bitbucket-pipelines 定位 apk 文件?
- c# - 当实体在不同的项目中时,为什么 Mediatr 不解析方法?
- excel - 兰德给出#n/a
- python - 如何在读取之前清除字符串并将str转换为int