2010-06-10 2 views
0

Я действительно не думаю, что есть какой-то способ сделать это ... Во всяком случае ... Как я могу заменить один объект другим в программе? Это будет похоже на то, что все ссылки на старый объект начинают указывать на новый.Как заменить один объект другим в программе?

+1

Возможно ли это во время выполнения? – ChrisF

+0

Runtime, время компиляции, время развертывания или что? –

+0

Да, это во время выполнения. – Yegor

ответ

1

Если это во время выполнения, посмотрите на реализацию прокси-сервера или класса-оболочки для экземпляра, который вы можете потенциально заменить.

Существуют и другие более сложные способы достижения такого же эффекта, это самый простой.

class Program { 
    public void DoReplace() { 

     // all instances in the program hold references to the proxy 

     // instantiate the default 
     ReplaceableProxy replaceable = new ReplaceableProxy(); 

     // some references to the replaceable are aquired 

     // later 
     replaceable.SetPoxiedClass(new OtherImplementation()); 

     // now all instances still hold a reference to the same proxy 
     // but the implementation has changed internally since the indirection is encapsulated 
     // in the proxy class 
    } 
} 


public interface IReplaceable { 
    void DoStuff(); 
} 

public class ReplaceableProxy : IReplaceable { // this is the proxy 

    private IReplaceable _Replaceable = new OriginalImplementation(); 

    public void DoStuff() { 
     _Replaceable.DoStuff(); 
    } 

    internal void SetPoxiedClass(IReplaceable replaceable) { 

     _Replaceable = replaceable; 
    } 
} 

public class OriginalImplementation : IReplaceable { 

    public void DoStuff() { 
     System.Console.WriteLine("original"); 
    } 
} 

public class OtherImplementation : IReplaceable { 
    public void DoStuff() { 
     System.Console.WriteLine("other"); 
    } 
} 
+0

Remoting? Я имею в виду всех этих «маршалов по refs». Или вы говорите о каком-то архитектурном решении/шаблоне? – Yegor

0

Если вы имеете в виду в коде, вы можете найти замену имени объекта. Так найти Objecta Заменить ObjectB

1

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

+0

Спасибо, что указал на слабые ссылки. Взгляды googlable, и поэтому я собираюсь узнать больше. – Yegor

1

Я do переименовывает старый объект, а затем пусть ошибки сборки компилятора показывают мне всюду, я должен внести изменения.

+0

Я думаю, вы хотели сказать: «то, что я делаю, переименовывает старый класс * тогда ...» Класс - это определение, объект - это его создание. – NotMe

+0

Мне нужно было время выполнения. Извините за непонятный вопрос. – Yegor

0

Это зависит от вашей IDE. Например, в Eclipse есть вкладка «Refactor» наверху, которая позволит вам переименовать выделенный класс и обновить все ссылки на него в вашем пакете (убедитесь, что вы проверяете вкладку «ссылки на обновления»).

0

Если модификатор доступа на объект установлен в Friend, Protected Friend или Public и ссылка на объект только не читается (т.е., это изменяемый), то вы можете просто повторно назначить его.

В VB:

Public strSQLConnect as String = "CONNECT....." 

'blah... blah... using the variable... hours later 

strSQLConnect = "CONNECT DIFFERENTLY....." 

Я не уверен, что это то, что вы хотите, но, возможно, это поможет вам.

0

Если вы хотите заменить экземпляры ClassA экземплярами ClassB (как в приведенном выше примере), перейдите с помощью решения @ MaLio выше ... в противном случае (т.е. если вы хотите заменить все ссылки на экземпляр ClassA со ссылками на Instance2 of ClassA), то ...

public class Reference<T> { 
    private T _instance; 

    public Reference(T instance) { 
     _instance = instance; 
    } 

    public T Instance { 
     get { return _instance; } 
    } 

    public event EventHandler<ReferenceReplacedEventArgs> ReferenceReplaced; 

    public void ReplaceWith(T newInstance) { 
     T oldInstance = _instance; 
     _instance = newInstance; 
     if(ReferenceReplaced != null) { 
     ReferenceReplaced(this, new ReferenceReplacedEventArgs(oldInstance, newInstance)); 
     } 
    } 

    public class ReferenceReplacedEventArgs : EventArgs { 
     private readonly T _oldInstance; 
     private readonly T _newInstance; 

     public ReferenceReplacedEventArgs(T oldInstance, T newInstance) { 
     _oldInstance = oldInstance; 
     _newInstance = newInstance; 
     } 

     public T OldInstance { 
     get { return _oldInstance; } 
     } 

     public T NewInstance { 
     get { return _newInstance; } 
     } 
    } 
} 
Смежные вопросы