2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
|
|||||||||||
1 | |||||||||||
.NET 4.x Одинаковые методы в разных классах - вопрос оптимальной реализации10.09.2014, 13:31. Показов 8775. Ответов 19
Метки нет (Все метки)
Есть 2 класса которые наследуются от одного интерфейса (т.е. есть общие поля и некоторые методы)
вот насчет методов у меня затык, эти методы должны быть в обоих классах (если они конечно же описаны в интерфейсе) но делают они одно и то же, смысл писать одинаковый код? Как бы извернуться что бы определенные методы описать в одном месте? Если очень приблизительно и очень упрощенно то вот, для наглядности что я имею ввиду: Кликните здесь для просмотра всего текста
И все хорошо, единственное плохо что код метода дублируется в обоих классах. Если бы методы можно было объявлять в интерфейсе, проблем не было б, но этого делать нельзя ) Единственное что на ум приходит это сделать еще 1 статический класс и описать эти методы в нем Кликните здесь для просмотра всего текста
в данном примере как бы норм т.к. очень упрощенно, но не очень хотелось бы создавать статический класс и в методы передавать инстансы классов. Может можно как-то по другому?
0
|
10.09.2014, 13:31 | |
Ответы с готовыми решениями:
19
Подскажите варианты в оптимальной реализации разбора строк с расписанием DateTime, для моего класса Schedule Движение фигур - вопрос оптимальной прорисовки Методы в произодных классах Дружественные методы в шаблонных классах |
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
10.09.2014, 13:46 | 2 |
Реализуйте интерфейс в классе class0, а class1 и class2 наследуйте от class0.
0
|
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
|
|
10.09.2014, 14:28 [ТС] | 3 |
kolorotur, но тогда мне в классе0 нужно будет дублировать все поля что описаны в интерфейсе
0
|
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
|
|
10.09.2014, 14:39 | 4 |
Создай абстрактный класс с повторяющимися методами и свои (class1 и class2) наследуй от этого абстрактного класса и интерфейса. Конечно, если в последующем не придётся приводить объекты к интерфейсу, ну а коль уж понадобиться такое, то только реализовывать интерфейс и от такого класса наследовать.
0
|
1144 / 873 / 506
Регистрация: 09.04.2014
Сообщений: 2,055
|
||||||
10.09.2014, 14:40 | 5 | |||||
вы ведь их "дублируете" в своих классах несколько раз, kolorotur предлагает вам не делать этого
0
|
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
|
|
10.09.2014, 14:46 | 6 |
Имхо, я бы родительский класс абстрактным сделал (чтобы объект не создать), а метод виртуальным (мало ли в каком классе переопределить нужно будет).
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
10.09.2014, 14:48 | 7 |
Хм... А что в приведенной автором иерархии классов приводит к мысли о том, что родительский класс должен быть абстрактным?
0
|
1144 / 873 / 506
Регистрация: 09.04.2014
Сообщений: 2,055
|
||||||
10.09.2014, 14:50 | 8 | |||||
и я, но когда по быстрому набрасываешь для примера, то нюансы ускользают
1
|
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
|
|
10.09.2014, 14:53 | 9 |
В общем-то ничего, поэтому я и начинал со аббревиатуры "имхо" и написал почему.
nedel, идеально! +
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
10.09.2014, 14:55 | 10 |
Я, задавая вопрос, и хотел узнать причину вашего имхо.
Извините, если сформулировал криво. Просто указанная причина "чтобы объект не создавать" заставляет задать тот же вопрос: а почему его нельзя создавать?
0
|
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
|
|
10.09.2014, 14:59 | 11 |
Странно, что Вы задали себе вопрос "Почему?", лично я себе задал "Зачем?" - зачем создавать объект класса, который не описывает всей архитектуры, задумки, и т.п.? Нет, в общем - разумеется можно, объект и объект, только какой от этого смысл?
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
10.09.2014, 15:11 | 12 |
А "почему" и "зачем" разве не синонимы?
Ну ладно, зачем делать абстрактным класс, который реализует все методы интерфейса и в нем отсутствуют методы или свойства, реализация которых не имеет смысла для данного класса? То есть класс является полноценным. Ну почему же не описывает? В примере, приведенном автором, вне зависимости от выбранного класса всегда вызывается метод Method1, который объявлен в родительском классе и имеет дефолтную реализацию. То есть родительский класс является полноценным кандидатом на создание объекта. И именно если брать в пример авторский код, то там условие можно вообще убрать, создавая экземпляр родительского класса, так как методы Method2 и Method3 нигде не используются, ибо не являются членами интерфейса ICommon.
0
|
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
|
|
10.09.2014, 15:19 | 13 |
В этой проверке вообще мало смысла, при условии, что объект в дальнейшем нигде не будет использоваться. Можно так объект любого подходящего типа создать начиная от родительского, заканчивая любым производным - метод у всех один и тот же.
А вот если объект будет дальше использоваться - тут может случится казус, когда потребуется метод не наследуемый, а реализованный. Здесь объект базового класса ну никак не подойдёт. В любом случае, я с Вами согласен - объект базового класса имеет место быть, при условии законченного кода, а точнее не использования объекта instance в дальнейшем. Но даже так - почему бы не создать в таком случае статический метод?
0
|
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
|
|
11.09.2014, 10:08 [ТС] | 14 |
вы правы, но только я не могу поступить как вы написали, это не мой класс и я не могу удалять его поля, могу только добавлять. Так что сделать один общий базовый класс и удалить поля из других я не могу.
0
|
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
|
|
11.09.2014, 10:16 | 15 |
Момент! Про какие поля, каких классов идёт речь? Про class1 и class2? Если да, то не ясно почему - наследование ты сделать можешь, а убрать поля, которые будут в базовом классе - ты не можешь. О каком рефакторинге тогда можно говорить?
0
|
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
|
|
11.09.2014, 11:00 [ТС] | 16 |
да
Эту фразу я не понял. я могу сделать третий класс базовый и наследовать от него class1 и class2, но смысл в этом какой если я из class1 и class2 убрать поля не смогу, а дублировать их в 3-х классах это перебор P.S. эти классы генерируются автоматом
0
|
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
|
|
11.09.2014, 11:13 | 17 |
т.е. описание класса генерируется автоматом? А можно полюбопытствовать код?
Ну и если созданием полей позаботились за тебя, то не мучь себя - в родительском классе объяви только общие методы сделай их виртуальными, а сам класс абстрактным (надеюсь kolorotur будет не против ) и наследуй.
0
|
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
|
|
11.09.2014, 12:14 [ТС] | 18 |
да.
сорри не могу, сей код собственность нашей системной части ))
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
11.09.2014, 12:30 | 19 |
А их и не надо убирать — они отнаследуются от базового класса.
Не позволю!!!!1
0
|
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
|
|
11.09.2014, 12:39 [ТС] | 20 |
не подходит я ж говорю, это нужно менять механизм генерации этих классов
Короч забейте, оставлю вариант с статическим классом
0
|
11.09.2014, 12:39 | |
11.09.2014, 12:39 | |
Помогаю со студенческими работами здесь
20
Как описывать методы в классах? Константные методы в абстрактных классах Определить методы-итераторы в неабстрактных классах Сигналы и слоты в разных классах Данные о классах в разных формах Слоты и сигналы в разных классах Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |