Рекомендации по проектированию для преобразования из ClassA в ClassB - PullRequest
1 голос
/ 08 сентября 2011

Я только начал работать над большой базой кода C #.Некоторые классы в коде почти идентичны другим, что само по себе является вопросом, и их необходимо преобразовать для повторного использования существующей логики.

В настоящее время в коде есть методы расширения, разбросанные по всемунемного усилий, чтобы найти и выяснить, как они называются, чтобы использовать их.Я хотел бы переместить все методы convert в класс, чтобы их было очень легко найти и использовать.Однако я не уверен, что является наиболее приемлемым способом преобразования одного типа данных в другой, когда у вас есть источник для всего.

Чтобы преобразовать ClassA в ClassB, я должен:

  1. добавить метод в ClassA,
  2. создать ClassAHelper,
  3. использовать метод расширения для ClassA?

Ответы [ 3 ]

4 голосов
/ 08 сентября 2011

Код для преобразования одного класса в другой (я полагаю, вы говорите о преобразованиях во время выполнения), возможно, не является необходимым способом.Например, если у вас есть класс X и класс Y, каждый из которых имеет void Blah(), который вы хотите вызвать из метода C, и метод C принимает X в качестве параметра, вместо этого вы можете извлечь общий интерфейс для X и Y итогда пусть C примет интерфейс вместо этого.Поэтому ваш Y может оставаться Y.

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

Пример, приведенный

interface ICanBlah { void Blah(); }
class X : ICanBlah { public void Blah() { } }
class Y { public void Blahhhhh() { } }

Вы можете написать

public class YBlahAdapter : ICanBlah 
{
    Y itsY;

    public YBlahAdapter(Y y) { itsY = y; }
    public void Blah() { itsY.Blahhhhh(); }
}

Поэтому, где бы у вас ни был метод, который принимает ICanBlah, и у вас есть объект типа Y, вы можете обернуть его в адаптер, а затем передать адаптер в метод.

С другой стороны, если вы действительно хотите выполнить преобразование во время выполнения X в Y или Y в X, вы можете определить операторы неявного или явного преобразования для одного или обоих.

public static explicit operator Y(X x) { /* build and return Y from X */ }

(Этот оператор должен быть объявлен в исходном файле одного из типов.)

0 голосов
/ 08 сентября 2011

Это не один в вашем списке ответов, но если все одинаково, за исключением одного или двух методов. Затем я бы посмотрел на то, как заставить ClassB наследовать ClassA и удалить общие методы. Это при условии, что они в одной семье ...

0 голосов
/ 08 сентября 2011

Вы также можете попробовать еще один вариант:

Создание функции конструктора для ClassB, которая принимает объект ClassA.

Тогда вы можете сделать:

ClassA foo = new ClassA();
ClassB bar = new ClassB(foo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...