Как я могу расширить два класса одинаково без копирования и вставки?

2

Я написал созданный владельцем TabControl, но наш проект также использует TabWorkspace, который происходит от TabControl. На данный момент у меня есть

public class OurTabControl : TabControl
{
     // some code that overrides protected methods
}

public class OurTabWorkspace : TabWorkspace
{
    // the same code
}

Я хотел бы, чтобы общий код отображался в одном месте, поэтому нам не нужно поддерживать две копии. Возможно ли это в С#, и если да, то как?

  • 0
    Ответ на самом деле зависит от того, что должен делать ваш общий код. Например, хотите ли вы, чтобы оба класса выставляли общих открытых членов? Нужно ли этому общему коду поддерживать состояние, соответствующее его работе?
Теги:

4 ответа

8

Вы можете сделать это с помощью интерфейса и написать метод расширения.

class OurTabControl: IBehavior
class OurTabWorkspace: IBehavior

interface IBehavior
{    
}

static class BehaviorExtensions
{
   static [returntype] RepeatedBehavior(this IBehavior behavior)
   {
       //repeated code here
   } 
}
  • 1
    Вы можете добавить методы расширения для интерфейсов в C #? Я никогда не знал этого. Здорово.
  • 0
    Это прекрасно, если вы можете устранить недостатки, вы должны убедиться, что в каждом из файлов кода, где должны использоваться эти методы, есть оператор using для пространства имен, содержащего класс расширения. Что еще важнее, методы расширения не могут манипулировать частными или защищенными членами. Вдобавок к этому, если общий код должен поддерживать какое-то дополнительное состояние, куда он будет помещен. Конечно, есть много ситуаций, когда эти ограничения приемлемы, но в других случаях это не решение.
Показать ещё 1 комментарий
1

Вы можете создать внутренний вспомогательный класс, содержащий общий код, и указать его как частный член в OurTabControl и OurTabWorkspace. Поскольку TabWorkspace расширяет TabControl, вы должны иметь возможность использовать полиморфизм и передавать параметры TabControl методам в классе-помощнике. Вам все равно придется переопределять любые распространенные методы в обоих ваших расширенных классах и вызывать методы вспомогательного класса и/или базовые методы оттуда.

1

Возможно, реорганизуйте общий код в один набор статических методов?

  • 0
    Почему статические методы?
  • 0
    Возможно, я не полностью понимаю вопрос OP, но, насколько я понимаю, у него есть производный TabControl и производный TabWorkspace ("OurTabControl" и "OurTabWorksapce".) Я прочитал вопрос, как о том, что два производных класса имеют общий (в настоящее время копия -pasted код.) Один из возможных способов сделать этот единый набор методов заключается в рефакторинге их для работы в качестве статических методов, которые могут совместно использоваться обоими производными классами.
0

Как насчет использования частичного класса? Или, как насчет определения всех общих методов в одном классе и унаследованных им экземпляров классов.

  • 0
    как поможет частичный класс? это просто разбивает код на несколько файлов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню