Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
1
.NET 4.x

Одинаковые методы в разных классах - вопрос оптимальной реализации

10.09.2014, 13:31. Показов 8775. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть 2 класса которые наследуются от одного интерфейса (т.е. есть общие поля и некоторые методы)
вот насчет методов у меня затык, эти методы должны быть в обоих классах (если они конечно же описаны в интерфейсе) но делают они одно и то же, смысл писать одинаковый код?
Как бы извернуться что бы определенные методы описать в одном месте?

Если очень приблизительно и очень упрощенно то вот, для наглядности что я имею ввиду:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 public interface ICommon {
    int i { get; set; }
    int a { get; set; }
    int Method1();
  }
 
  public class class1 :ICommon {
    public int i { get; set; }
    public int a { get; set; }
 
    public int Method1() {
      return this.i + this.a;
    }
    public void Method2() {
      
    }
  }
 
  public class class2 :ICommon {
    public int i { get; set; }
    public int a { get; set; }
 
    public int Method1() {
      return this.i + this.a;
    }
    public void Method3() {
 
    }
  }
 
  class Program {
    static void Main(string[] args) {
      ICommon instance;
      if(true /*рак свистнул*/)
        instance = new class2();
      else
        instance = new class1();
 
      // и не важно какой класс будет, Method1 мы все равно выполним
      instance.Method1();
    }
    
  }


И все хорошо, единственное плохо что код метода дублируется в обоих классах.
Если бы методы можно было объявлять в интерфейсе, проблем не было б, но этого делать нельзя )
Единственное что на ум приходит это сделать еще 1 статический класс и описать эти методы в нем

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 public interface ICommon {
    int i { get; set; }
    int a { get; set; }
  }
 
  public static class AddClass {
    public static int Method1(ICommon obj) {
      return obj.a + obj.i;
    }  
  }
 
  public class class1 :ICommon {
    public int i { get; set; }
    public int a { get; set; }
 
    public void Method2() {
      
    }
  }
 
  public class class2 :ICommon {
    public int i { get; set; }
    public int a { get; set; }
 
    public void Method3() {
 
    }
  }
 
  class Program {
    static void Main(string[] args) {
      ICommon instance;
      if(true /*рак свистнул*/)
        instance = new class2();
      else
        instance = new class1();
 
      // и не важно какой класс будет, Method1 мы все равно выполним
      AddClass.Method1(instance);
    }
    
  }


в данном примере как бы норм т.к. очень упрощенно, но не очень хотелось бы создавать статический класс и в методы передавать инстансы классов. Может можно как-то по другому?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2014, 13:31
Ответы с готовыми решениями:

Подскажите варианты в оптимальной реализации разбора строк с расписанием DateTime, для моего класса Schedule
С недавних пор учу C# и мне нужна помощь в реализации класса для задания и расчета времени по...

Движение фигур - вопрос оптимальной прорисовки
Доброго времени суток. Нужно написать мини-игру. Суть игры простая на экране три...

Методы в произодных классах
Имеется у меня базовый класс и его наследник. В наследнике появляются новые методы, которые не были...

Дружественные методы в шаблонных классах
template<typename T> class A { private: int a = 0; public: void func(A<double> second) { ...

19
Эксперт .NET
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
Цитата Сообщение от anonimus Посмотреть сообщение
но тогда мне в классе0 нужно будет дублировать все поля что описаны в интерфейсе
вы ведь их "дублируете" в своих классах несколько раз, kolorotur предлагает вам не делать этого
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public interface ICommon {
    int i { get; set; }
    int a { get; set; }
    int Method1();
  }
  public class class0 :ICommon {
    public int i { get; set; }
    public int a { get; set; }
 
    public int Method1() {
      return this.i + this.a;
    }
  }
  public class class1 :class0 {
    public void Method2() {
      
    }
  }
 
  public class class2 :class0 {
    public void Method3() {
 
    }
  }
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
10.09.2014, 14:46 6
Имхо, я бы родительский класс абстрактным сделал (чтобы объект не создать), а метод виртуальным (мало ли в каком классе переопределить нужно будет).
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
10.09.2014, 14:48 7
Цитата Сообщение от BozKurt Посмотреть сообщение
я бы родительский класс абстрактным сделал (чтобы объект не создать)
Хм... А что в приведенной автором иерархии классов приводит к мысли о том, что родительский класс должен быть абстрактным?
0
1144 / 873 / 506
Регистрация: 09.04.2014
Сообщений: 2,055
10.09.2014, 14:50 8
Цитата Сообщение от BozKurt Посмотреть сообщение
я бы родительский класс абстрактным сделал (чтобы объект не создать), а метод виртуальным
и я, но когда по быстрому набрасываешь для примера, то нюансы ускользают
C#
1
2
3
4
5
6
7
8
public abstract class class0 :ICommon {
    public int i { get; set; }
    public int a { get; set; }
 
    public virtual int Method1() {
      return this.i + this.a;
    }
  }
1
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
10.09.2014, 14:53 9
Цитата Сообщение от kolorotur Посмотреть сообщение
А что в приведенной автором иерархии классов приводит к мысли о том, что родительский класс должен быть абстрактным?
В общем-то ничего, поэтому я и начинал со аббревиатуры "имхо" и написал почему.

nedel, идеально! +
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
10.09.2014, 14:55 10
Цитата Сообщение от BozKurt Посмотреть сообщение
В общем-то ничего, поэтому я и начинал со аббревиатуры "имхо" и написал почему.
Я, задавая вопрос, и хотел узнать причину вашего имхо.
Извините, если сформулировал криво.

Просто указанная причина "чтобы объект не создавать" заставляет задать тот же вопрос: а почему его нельзя создавать?
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
10.09.2014, 14:59 11
Странно, что Вы задали себе вопрос "Почему?", лично я себе задал "Зачем?" - зачем создавать объект класса, который не описывает всей архитектуры, задумки, и т.п.? Нет, в общем - разумеется можно, объект и объект, только какой от этого смысл?
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
10.09.2014, 15:11 12
Цитата Сообщение от BozKurt Посмотреть сообщение
Странно, что Вы задали себе вопрос "Почему?", лично я себе задал "Зачем?"
А "почему" и "зачем" разве не синонимы?
Ну ладно, зачем делать абстрактным класс, который реализует все методы интерфейса и в нем отсутствуют методы или свойства, реализация которых не имеет смысла для данного класса? То есть класс является полноценным.

Цитата Сообщение от BozKurt Посмотреть сообщение
зачем создавать объект класса, который не описывает всей архитектуры, задумки, и т.п.? Нет, в общем - разумеется можно, объект и объект, только какой от этого смысл?
Ну почему же не описывает?
В примере, приведенном автором, вне зависимости от выбранного класса всегда вызывается метод 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
Цитата Сообщение от BozKurt Посмотреть сообщение
Про class1 и class2
да
Цитата Сообщение от BozKurt Посмотреть сообщение
Если да, то не ясно почему - наследование ты сделать можешь, а убрать поля, которые будут в базовом классе - ты не можешь
Эту фразу я не понял.
я могу сделать третий класс базовый и наследовать от него class1 и class2, но смысл в этом какой если я из class1 и class2 убрать поля не смогу, а дублировать их в 3-х классах это перебор

P.S.
эти классы генерируются автоматом
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
11.09.2014, 11:13 17
Цитата Сообщение от anonimus Посмотреть сообщение
эти классы генерируются автоматом
т.е. описание класса генерируется автоматом? А можно полюбопытствовать код?
Ну и если созданием полей позаботились за тебя, то не мучь себя - в родительском классе объяви только общие методы сделай их виртуальными, а сам класс абстрактным (надеюсь kolorotur будет не против ) и наследуй.
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
11.09.2014, 12:14  [ТС] 18
Цитата Сообщение от BozKurt Посмотреть сообщение
т.е. описание класса генерируется автоматом?
да.
Цитата Сообщение от BozKurt Посмотреть сообщение
А можно полюбопытствовать код?
сорри не могу, сей код собственность нашей системной части ))
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
11.09.2014, 12:30 19
Цитата Сообщение от anonimus Посмотреть сообщение
я могу сделать третий класс базовый и наследовать от него class1 и class2, но смысл в этом какой если я из class1 и class2 убрать поля не смогу
А их и не надо убирать — они отнаследуются от базового класса.

Цитата Сообщение от BozKurt Посмотреть сообщение
надеюсь kolorotur будет не против
Не позволю!!!!1
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
11.09.2014, 12:39  [ТС] 20
Цитата Сообщение от kolorotur Посмотреть сообщение
А их и не надо убирать
не подходит я ж говорю, это нужно менять механизм генерации этих классов

Короч забейте, оставлю вариант с статическим классом
0
11.09.2014, 12:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2014, 12:39
Помогаю со студенческими работами здесь

Как описывать методы в классах?
Отдельно как функцию, или обязательно внутри объявления класса??

Константные методы в абстрактных классах
Добрый день! Помогите, пожалуйста, разобраться с константными методами в абстрактных классах....

Определить методы-итераторы в неабстрактных классах
Всем добрый вечер! У меня загвоздка вот с таким заданием: Определить методы-итераторы в...

Сигналы и слоты в разных классах
Всем привет. Есть класс в котором описываю методы для работы с TCP/ip. "IMU_Tcp_Client.h" ...

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

Слоты и сигналы в разных классах
Только начал изучать QT. Работаю 3.3. Не получается связать слоты и сигналы в разных классах....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru