внешняя изменяющаяся реализация класса - PullRequest
0 голосов
/ 19 мая 2018

Есть ли способ изменить реализацию данного класса извне?Например, у меня есть следующая реализация:

 public partial class Test
{
    public Interface1 Field = new Class1();
}
public interface Interface1
{
    //implementation    
}
public class Class1 : Interface1
{
    //implementation
}

Я хотел бы определить другой класс:

public class Class2 : Interface1
{
    //implementation
}

и изменить Test.Field на объект класса Class2.Я не могу изменить реализацию класса Test.Я могу только добавить другой файл с его частичной реализацией.Я также не могу использовать любые библиотеки внедрения зависимостей.

1 Ответ

0 голосов
/ 19 мая 2018

Если Test является частичным классом, у которого нет конструктора, тогда вы можете добавить конструктор Test() в другой файл и перезаписать значение поля (инициализаторы полей запускаются перед создателем класса).Обратите внимание, что Class1 все еще будет построен, но будет отброшен.Если создание new Class1 является дешевой операцией, то нет проблем с «потерей» работы, но если new Class1 очень медленный (возможно, потому, что он читает 5 ГБ данных с диска), то это «плохо» длясделайте это.

Есть еще один замечательный трюк с частичными классами: если new Class1 не использует полностью заданные имена (имена с полным пространством имен), тогда если вы выполните

partial class Test 
{ 
    // Your Class1 (technically Test.Class1)
    // that is distinct from the other Class1
    public class Class1 : Interface1 { } 
}

, тогдаnew Class1() будет "указывать" на ваш Class1, потому что разрешение имен работает именно так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...