为什么 C# 方法会返回抽象类?

Mar*_*rkD -3 c#

我正在编写一个库和一个返回响应对象的库。我喜欢看几个例子,例如 MSFT 如何做到这一点。

我查看了 Azure BlobClient 删除方法,该方法返回 Azure.Response() 对象,该对象本身被标记为抽象对象,但我可以像使用任何实例化对象一样使用 Response 对象。

var response = blobClient.Delete(...)
if(response.Status ==206)
{
    etc
Run Code Online (Sandbox Code Playgroud)

我不理解实现 - 这个 delete 方法(它在 BlobClientBase 基类上是虚拟的,但似乎没有被 BlobClient 覆盖)返回一个抽象类。

问:它如何被实例化以便我直接使用它?可能我在这里遗漏了一些面向对象的理论 - 提前感谢您的任何见解。

从 BlobClientBase 元数据...

public class BlobBaseClient        
{
...
public virtual Response Delete(DeleteSnapshotsOption snapshotsOption = DeleteSnapshotsOption.None, BlobRequestConditions conditions = null, CancellationToken cancellationToken = default);
Run Code Online (Sandbox Code Playgroud)

从 Azure.Storage.Blobs 元数据...

public class BlobClient : BlobBaseClient
Run Code Online (Sandbox Code Playgroud)

Response 的定义如下,我假设抽象意味着 Response 缺少一些实现(例如它自己的抽象属性和方法)。

来自 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);
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ian 7

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

abstract class Abstract {}

class Concrete : Abstract {}

Abstract MyMethod() {
   return new Concrete();
}
Run Code Online (Sandbox Code Playgroud)