为什么给接口设置一个属性值?
Why set a property value of an interface?
在自定义 HttpClient 的以下代码中,我发现一个方法 take 接受一个接口并写入它,就好像它是一个具有属性的对象一样:
public async Task<T> GetAsync<T>(ICacheContext cacheContext = null) {
try {
T result = default(T);
// check if value is cached
if (cacheContext != null) {
result = await GetResultFromCache<T>(cacheContext);
if (result != null) {
cacheContext.IsDataFromCache = true;
return result;
}
}
我对 cacheContext.IsDataFromCache = true;
有点困惑。为什么要设置接口的属性?这不是您要对所述接口的对象实现做的事情吗?
可能它接收到一个实例,该实例在 OOP 的多态性方面实现了 ICacheContext
例如
ICacheContext cacheCtx = new CacheContextImpl() // Class which implements ICacheContext
通过引用接口而不是具体的 class,您可以轻松更换接口的实现,而无需更改引用对象的每个方法。在代码示例中,如果 ICacheContext 的三个实现都需要该方法,则使用接口允许它们都使用相同的方法。否则,您需要为每个实现创建三个具有不同签名的 GetAsync 方法。
在方法签名中使用接口而不是基础 class 的另一个原因是强制执行良好的编码实践 - 如果该方法只需要基础 class 的 ICacheContext 属性,使用接口会阻止您使用其他 properties/methods 实现(也许 CacheContextImplementation.cs 还处理日志记录或配置或您不想在 'GetAsync' 方法中处理的东西),限制自己界面迫使您对 OOP 更加友好。
此外,从技术上讲,代码并未设置界面的 属性。它正在设置实现的属性,使用接口的掩码。
希望这对您有所帮助,并且有意义
在自定义 HttpClient 的以下代码中,我发现一个方法 take 接受一个接口并写入它,就好像它是一个具有属性的对象一样:
public async Task<T> GetAsync<T>(ICacheContext cacheContext = null) {
try {
T result = default(T);
// check if value is cached
if (cacheContext != null) {
result = await GetResultFromCache<T>(cacheContext);
if (result != null) {
cacheContext.IsDataFromCache = true;
return result;
}
}
我对 cacheContext.IsDataFromCache = true;
有点困惑。为什么要设置接口的属性?这不是您要对所述接口的对象实现做的事情吗?
可能它接收到一个实例,该实例在 OOP 的多态性方面实现了 ICacheContext
例如
ICacheContext cacheCtx = new CacheContextImpl() // Class which implements ICacheContext
通过引用接口而不是具体的 class,您可以轻松更换接口的实现,而无需更改引用对象的每个方法。在代码示例中,如果 ICacheContext 的三个实现都需要该方法,则使用接口允许它们都使用相同的方法。否则,您需要为每个实现创建三个具有不同签名的 GetAsync 方法。
在方法签名中使用接口而不是基础 class 的另一个原因是强制执行良好的编码实践 - 如果该方法只需要基础 class 的 ICacheContext 属性,使用接口会阻止您使用其他 properties/methods 实现(也许 CacheContextImplementation.cs 还处理日志记录或配置或您不想在 'GetAsync' 方法中处理的东西),限制自己界面迫使您对 OOP 更加友好。
此外,从技术上讲,代码并未设置界面的 属性。它正在设置实现的属性,使用接口的掩码。
希望这对您有所帮助,并且有意义