У меня есть эти классы в C # (.NET Framework 3.5), описанные ниже:
public class Base
{
public int State {get; set;}
public virtual int Method1(){}
public virtual string Method2(){}
...
public virtual void Method10(){}
}
public class B: Base
{
// some implementation
}
public class Proxy: Base
{
private B _b;
public Proxy(B b) { _b = b; }
public override int Method1()
{
if (State == Running)
return _b.Method1();
else
return base.Method1();
}
public override string Method2()
{
if (State == Running)
return _b.Method2();
else
return base.Method2();
}
public override void Method10()
{
if (State == Running)
_b.Method10();
else
base.Method10();
}
}
Я хочу получить что-то такое :
public Base GetStateDependentImplementation()
{
if (State == Running) // may be some other rule
return _b;
else
return base; // compile error
}
, и реализация моего Прокси будет :
public class Proxy: Base
{
...
public override int Method1()
{
return GetStateDependentImplementation().Method1();
}
public override string Method2()
{
return GetStateDependentImplementation().Method2();
}
...
}
Конечно, я могу сделать это (агрегация базовой реализации):
public RepeaterOfBase: Base // no any overrides, just inheritance
{ }
public class Proxy: Base
{
private B _b;
private RepeaterOfBase _Base;
public Proxy(B b, RepeaterOfBase aBase)
{
_b = b;
_base = aBase;
}
}
...
public Base GetStateDependentImplementation()
{
if (State == Running)
return _b;
else
return _Base;
}
...
Но экземпляр Базового класса очень большой, и я должен избегать других дополнительных копий в памяти.
Итак, я
- должен упростить мой код
- надо "обернуть" реализацию
- необходимо избегать кода дублирования
- должны избегать агрегирования любых дополнительных
экземпляр Базового класса (дублирование)
Возможно ли достичь этих целей?