расширение наследования? - PullRequest
1 голос
/ 02 апреля 2011

У меня есть класс:

class A {
    method 1
    method 2
    method 3
}

Теперь я хотел бы добавить новый метод: метод 4, орех Я не могу изменить файл класса А.Какова лучшая практика:
1. Должен ли я использовать расширения?
2. Должен ли я наследовать A, и там я реализую новый метод?Если так - как будет называться дочерний класс?

Позже я хотел бы иметь возможность:

A ains=new A(); //A or other name
ains.method4();

Ответы [ 4 ]

4 голосов
/ 02 апреля 2011

Правило, которое я обычно придерживаюсь в этом сценарии:

Я добавляю только поведение или данные и / или поведение?

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

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

2 голосов
/ 02 апреля 2011

Зависит от сценария использования. A не имеет Method4, поэтому ни один метод, который принимает A в качестве его параметра, не может полагаться на существование Method4.

Если вам нужен только Method4 как помощник, внутренний для вашего класса, реализуйте его как расширение. В противном случае создайте класс B, производный от A, чтобы внешние классы, которым требуется Method4, могли надежно запросить B в качестве своего параметра вместо A.

Конечно, исключения всегда применяются. LINQ является примером того, где использование подклассов было бы нецелесообразным.

В комментарии вы упомянули о необходимости собственности. В этом случае создание class B : A является вашей основной опцией, поскольку отсутствуют свойства расширения. Другой вариант - создание class B { public A TheA {get; set;} }, который оборачивается вокруг A.

Но, как уже было сказано, это зависит от случая и использования в реальном мире. Если вам абсолютно необходимо работать с A и вам нужно вызывать методы для этого A, тогда методы расширения - ваш выбор, и у вас не может быть свойств. Вместо этого создайте методы Get / Set и сохраните значение свойства в другом месте.

2 голосов
/ 02 апреля 2011

Похоже, вам нужно использовать расширение, но без дополнительной информации трудно сказать. Наследование - это когда тип ребенка A, а не когда вам просто нужно добавить метод.

1 голос
/ 02 апреля 2011

Используйте наследование только тогда, когда вы сможете использовать ссылку A везде, где вы хотите использовать ссылку производного класса. Если ваше единственное намерение состоит в том, чтобы использовать методы из A, используйте делегирование.

С другой стороны, вы можете попробовать расширения.

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