为什么我们不能在聚合中具体实现基接口?

时间:2018-05-05 13:19:10

标签: c# oop

在实现接口时,为什么我们不能在聚合中具体实现基接口?

哪个OOP原则在这里违反了? Mark Directory As > Test Sources Root基本上是IStorageEntitySas类型

StorageEntitySas

2 个答案:

答案 0 :(得分:3)

接口定义了每个实现类必须实现的契约。它定义了方法必须返回的内容以及您可以使用的参数。特别是,您的界面的用户不知道 - 并且不必知道具体类的任何内容,这是一个实现细节。

但您仍然可以执行以下操作:

>>> import logging.handlers
>>> logging.handlers.WatchedFileHandler
<class 'logging.handlers.WatchedFileHandler'>

那为什么不允许这样做?想象一下,你有一个只返回接口类型的API。

public class ValetKeyResponse : IValetKeyResponse
{
    public IStorageEntitySas Sas { get; set; } = new StorageEntitySas();
    public string UploadUrl { get; set; }
}

此API的客户端不知道您实际获得哪个类,因此您可以将IValetKeyResponse response = myClass.GetValetResponse(); // what am I allowed to pass here when I don´t know the actual class of response? response.Sas = ... 分配给该实例。这就是合同定义的内容,你可以传递任何实现IStorageEntitySaS的内容。

答案 1 :(得分:2)

Sas属性上的setter允许您提供IStorageEntitySas的任何实现。这意味着您应该能够:

public class OtherStorageSas : IStorageEntitySas { ... }

IValetKeyResponse r = new ValetKeyResponse();
r.Sas = new OtherStorageSas();

如果ValetKeyResponse.Sas具有不兼容的类型StorageEntitySas,则不允许使用此类型。