powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как упростить такую иерархию классов ?
11 сообщений из 11, страница 1 из 1
Как упростить такую иерархию классов ?
    #39876062
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В некотором коде, в некотором государстве жил был такой код. Как бы его упростить ?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SomeDataBase
{
  
}

MandatorySomeData: SomeDataBase
{
  public int Data {get;set;}
}


OptionalSomeData: SomeDataBase
{
  public int? Data {get;set;}
}



А дальше идет спорная часть

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
OrderedMandatorySomeData: MandatorySomeData
{
  public string Order {get;set;}
}

OrderedOptionalSomeData: OptionalSomeData
{
  public string Order {get;set;}
}




Не нравится такое не хорошее ветвление в иерархии классов. Если добавится еще какое-то свойство к текущей иерархии, то количество классов-наследников будет расти в геометрической прогрессии. Как решить такую проблему ? Желательно с примером кода.
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876064
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хехе, тут недавно тёрли за интерфейсы с дефолтной реализацией - как раз об этом ))
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876065
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно бы задействовать дженерики. Но решение тоже не очень нравится.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
abstract SomeDataBase
{
  
}

MandatorySomeData: SomeDataBase
{
  public int Data {get;set;}
}


OptionalSomeData: SomeDataBase
{
  public int? Data {get;set;}
}

OrderedSomeData<TSomeData>
  where TSomeData: SomeDataBase
{
  public TSomeData SomeData {get;set;}
  public string Order {get;set;}
}



Тут мы отходим от наследования. Насколько это терпимо ?
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876066
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у тебя нет наследования реализации, кроме как объявления свойств, я бы не парился, сделал бы множестенную реализацию интерфейсов, а сами свойства делал в конечном классе. Нагенерить их - две секунды.
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876068
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Что за множественная реализация интерфейсов ?
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876071
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WaspNewCore,

В моем решении с дженериками мне не нравится то, что потеряв наследование, мы уже не сможем где то ниже по иерархии написать:

Код: c#
1.
2.
3.
4.
5.
class MyClass <TSomeData>
  where TSomeData: SomeDataBase
{}

class MyOrderedClass <OrderedSomeData>  !


Но OrderedSomeData уже не является классом SomeDataBase !


Так как быть ?
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876079
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

А ты не делай наследования вообще. GoF, например, рекомендует по возможности его избегать, отдавая предпочтение другим опциям (интерфейсы, делегирование). Развесистое дерево классов оно как раз так и есть слишком "деревянное" и, в случае чего, его запросто придется полностью ломать.
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876080
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

1. Советую ознакомиться с паттерном Мост (решение проблемы геометрической прогрессии в иерархии)
2. Подумайте, зачем вам иерархия? какую задачу это решает?

-- если единственным ответом является экономия букв (не писать похожие свойства два раза), то вам однозначно, 100% не нужна иерархия, противопоказано
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876081
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreТак как быть ?

Максмум, что вам может тут подойти это интерфейсы, так как по ходу вам просто нужен декларативный контракт.
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876096
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore, как пример без наследования:

Код: 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 IDataContainer<TData>
{
	TData Data { get; set; }
}

public class DefaultDataContainer<TData> : IDataContainer<TData>
{
	public TData Data { get; set; }
}

public interface IOrderContainer
{
	string Order { get; set; }
}

public class DefaultOrderContainer : IOrderContainer
{
	public string Order { get; set; }
}

public class Foo<TData> : IDataContainer<TData>, IOrderContainer
{
	private readonly IDataContainer<TData> _dataContainer;
	private readonly IOrderContainer _orderContainer;

	public Foo(IDataContainer<TData> dataContainer, IOrderContainer orderContainer)
	{
		_dataContainer = dataContainer;
		_orderContainer = orderContainer;
	}

	public string Order
	{
		get => _orderContainer.Order;
		set => _orderContainer.Order = value;
	}

	public TData Data
	{
		get => _dataContainer.Data;
		set => _dataContainer.Data = value;
	}
}
...
Рейтинг: 0 / 0
Как упростить такую иерархию классов ?
    #39876097
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreМожно бы задействовать дженерики. Но решение тоже не очень нравится.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
abstract SomeDataBase
{
  
}

MandatorySomeData: SomeDataBase
{
  public int Data {get;set;}
}


OptionalSomeData: SomeDataBase
{
  public int? Data {get;set;}
}

OrderedSomeData<TSomeData>
  where TSomeData: SomeDataBase
{
  public TSomeData SomeData {get;set;}
  public string Order {get;set;}
}




Тут мы отходим от наследования. Насколько это терпимо ?

ты просто не умеешь их готовить

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public SomeDataBase<T>
{
   public T Data {get; set;}
}

OrderedSomeData<T>: SomeDataBase<T>
{
   public string Order {get;set;}
}
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как упростить такую иерархию классов ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]