이 (이것은 물론 실제 코드는 아니지만이 같은 특성이있다) 코드로 설명 할 아마도 가장 쉬운 방법입니다 : 내가 뭔가를 보이는 인터페이스가구현 클래스가 봉인 될 때 단일 인터페이스 메서드를 재정
을 같은 :
이제//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 interface ISomeProvider
{
object GetFoo1(); //<-- This needs caching
//These others don't
object GetFoo2();
object GetFoo3();
//And let's say 20 more
}
을 그리고이 이와 같은 구현이 이전 버전의 인스턴스를 사용하여 호출을 캐시하는 인터페이스의 새 버전입니다.
나는 순간에 이런 식으로 일을 해요 :
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
}
이 (적어도) 두 가지 문제가 있습니다
- 때마다 누군가가 내가 가야 인터페이스에 메소드를 추가를 이 새로운 메서드가 캐시되지 않게하려면이 코드를 변경하십시오.
- 나는이 기본 코드를 호출하는 쓸모없는 코드 목록을 얻었습니다.
누구나 이러한 문제가없는 방법을 생각할 수 있습니까?
올바른 방법은 캡슐화를 통한 상속입니다.유지하는 임무이지만 컴파일러는이 클래스 중 하나가 오래된 경우 알려줍니다. –