首页 > 解决方案 > 为什么 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);
}

标签: c#

解决方案


抽象类Response是方法的返回类型,而不是返回实例的类型。您可以将抽象类定义为返回类型,但您需要返回的是从抽象类继承的具体实现。

abstract class Abstract {}

class Concrete : Abstract {}

Abstract MyMethod() {
   return new Concrete();
}

推荐阅读