在实现接口时,为什么我们不能在聚合中具体实现基接口?
哪个OOP原则在这里违反了? Mark Directory As > Test Sources Root
基本上是IStorageEntitySas类型
StorageEntitySas
答案 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
,则不允许使用此类型。