У меня есть проблема с дизайном, которую я хотел бы решить.У меня есть интерфейс, давайте назовем его IProtocol
, который реализуется двумя отдельными классами.Мы смотрим более 600 строк кода здесь.Подавляющее большинство того, что они делают, - то же самое, за исключением для некоторых конкретных областей, таких как DiffStuff();
Текущая структура выглядит примерно так:
public class Protocol1 : IProtocol
{
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
И
public class Protocol2 : IProtocol
{
MyInterfaceMethod1()
{
Same1();
Same2();
}
}
У меня проблемы с копированием-вставкой и классическая проблема дублирования кода, если я оставлю эти два протокола раздельными.Мы говорим о полных 600 строках кода, а не о простых методах.
Я рассматриваю вопрос об изменении реализации Protocol1 для наследования от protocol2, например, так (Protocol2 в основном останется прежним, за исключением того, что мне придется обернуть Same1()
и Same2()
в частные методы.)
public class Protocol1 : Protocol2
{
void Same1()
{
base.Same1();
}
void Same2()
{
base.Same2();
}
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
Правильный ли это способ решения этой проблемы?
Редактировать: Многие люди помогли мне с этим вопросом, спасибо за ясное понимание.В моем случае два объекта не относятся к одному и тому же типу, хотя большая часть их реализации является общей, поэтому я пошел с предложением Бобби использовать абстрактный базовый класс, создавая небольшие методы для инкапсуляции изменений между классами,Дополнительная благодарность:
- Жлобер
- Ганс Пассант
- Джефф Стерн