Как «обернуть» реализацию в C # - PullRequest
1 голос
/ 19 марта 2010

У меня есть эти классы в 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; 
    }
...

Но экземпляр Базового класса очень большой, и я должен избегать других дополнительных копий в памяти.

Итак, я

  • должен упростить мой код
  • надо "обернуть" реализацию
  • необходимо избегать кода дублирования
  • должны избегать агрегирования любых дополнительных экземпляр Базового класса (дублирование)

Возможно ли достичь этих целей?

Ответы [ 2 ]

2 голосов
/ 23 марта 2010

Одним из решений является извлечение дорогостоящего состояния в его собственный класс и совместное использование его экземпляра между вашими конкретными реализациями.

0 голосов
/ 19 марта 2010

Вы можете сделать так, чтобы ваш прокси-объект неявно конвертировался в Base следующим образом:

public class BaseProxy
{
   private Base _base;
   private B _runningBase;

   public BaseProxy(B b)
   {
      _base = new Base();
      _runningBase = b; 
   }

   public static implicit operator Base(BaseProxy proxy)
   {
      return (State == Running) ? proxy._runningBase : proxy._base;
   }
}

Это позволит вашему клиентскому коду получить ссылку на базовый объект (поэтому он не полностью изолирован), но он позволит вам получить доступ к прокси и иметь методы, ведущие себя так, как вы ожидаете.


Примечание: на самом деле это не позволяет неявное использование, как я думал.

...