Создание абстракции над классом, расположенным во внешней библиотеке

#c#

#c#

Вопрос:

Проект c #, над которым я работаю, содержит ссылки на конкретный тип «Продукта», который находится во внешнем классе libray. Класс «Product» не реализует никакого интерфейса.

Я хотел бы создать интерфейс «IProduct» на основе «Product» и использовать этот код интерфейса, чтобы я мог программировать для интерфейса, а не для реализации.

Поскольку я все еще хочу продолжать использовать тип «Product», какой может быть хороший шаблон, позволяющий моему коду знать, что «Product» реализует «IProduct»?

Поскольку «Product» находится во внешней библиотеке, я не могу изменить его объявление (т.е. Procut: IProduct).

У класса также нет открытого конструктора, поэтому я думаю, что расширять его не вариант.

Какой шаблон решения хорош для этого сценария? Оболочка?

Спасибо.

Комментарии:

1. Вы обсудили типы: Product , Produt , Prodcut , Procuct Procut и,,. Все ли они разные или должны быть одинаковыми?

2. Похоже, вам нужно взглянуть на шаблон адаптера

Ответ №1:

Вы, вероятно, захотите использовать шаблон адаптера.

Итак, вы можете сделать что-то вроде приведенного ниже:

 public class Product 
{
    // Your Product Class
}

public class MyProduct : Product,  IProduct
{

}
  

Где MyProduct класс реализует интерфейс, но также имеет все общедоступные и защищенные методы / свойства, доступные из Product класса. Это позволяет вам расширить исходный класс без внесения изменений в Product класс, который следует принципу открытия / закрытия.

Вы можете прочитать больше об этом здесь: https://exceptionnotfound.net/the-daily-design-pattern-adapter /

Комментарии:

1. Могу ли я сделать это, если продукт не предоставляет общедоступный конструктор?

2. пока класс Product не объявлен как запечатанный, вы должны иметь возможность производить от него

3. он не запечатан, но я думаю, что если у него нет открытого конструктора, я получу сообщение об ошибке «‘Product’ не содержит конструктор, который принимает 0 аргументов». В моем случае продукт не имеет другой перегрузки открытого конструктора.

4. проверьте, имеет ли продукт частный конструктор

5. все перегрузки конструктора являются внутренними.