這可能是最簡單的代碼(這當然不是實際的代碼,但它具有相同的屬性)來解釋:重寫一個單一的接口方法時實現類是密封
我有一個看起來是一個接口像這樣:
public interface ISomeProvider
{
object GetFoo1(); //<-- This needs caching
//These others don't
object GetFoo2();
object GetFoo3();
//And let's say 20 more
}
與此有類似這樣的實現:
//NOTE: Sealed class otherwise we could inherit from it
public sealed class SuperCleverProvider : ISomeProvider
{
public object GetFoo1()
{
return "a";
}
public object GetFoo2()
{
return "b";
}
public object GetFoo3()
{
return "b";
}
}
現在這些調用之一,讓我們說GetFoo1是真的很重,所以我想提供商一個接口的新版本,使用舊版本的一個實例緩存對它的調用。
我正在做這樣的時刻:
public class CachedSuperCleverProvider : ISomeProvider
{
private readonly SuperCleverProvider _provider;
public CachedSuperCleverProvider(SuperCleverProvider provider)
{
_provider = provider;
}
private object UsingCache<T>(string cacheKey, Func<T> eval)
{
//Pretend this does caching. This is not related to the question
throw new NotImplementedException();
}
public object GetFoo1()
{
return UsingCache("foo1", _provider.GetFoo1);
}
//The code below this point is what I want to get rid of
public object GetFoo2()
{
return _provider.GetFoo2();
}
public object GetFoo3()
{
return _provider.GetFoo3();
}
//And so on for all the rest
}
這有兩個問題(至少):
- 每當有人向我必須去界面的方法改變這一點,即使我不想要這種新方法被緩存
- 我得到這個龐大的無用的代碼列表,只是調用通過底層的實現。
任何人都可以想到一個這樣做的方式,沒有這些問題?
你的方式是100%正確的 - 它是通過封裝繼承的。這是一個維護任務,但如果其中一個類已過期,則編譯器會通知您。 –