Вопрос об дженериках (параметры типа и конструкторы)

StackOverflow https://stackoverflow.com/questions/603229

  •  03-07-2019
  •  | 
  •  

Вопрос

Если у вас есть пользовательский класс коллекции, который хранит веса одного класса фруктов индивидуально в числах с плавающей запятой/двойной, например:

1.1, 3.3, 6.6, 4.4, ...

и вам нужно будет указать, является ли он плавающим или двойным, и различать тип фруктов, лучше ли сделать это следующим образом:

Использование перечисления:

FruitList<float, FruitType.Orange>

или

Использование перечисления в конструкторе:

FruitList<float> (FruitType.Orange)

или

Использование класса:

FruitList<float, Orange>

или

Использование класса в конструкторе:

FruitList<float> (Orange)

Меня смущает то, имеет ли смысл указывать подобные вещи в области <> (не знаю, как эта область называется)?

Какая практика лучше, быстрее и эффективнее?

Кстати, класс Orange никогда нигде не используется, просто написал его, имеет ли смысл указывать такой тип?

РЕДАКТИРОВАТЬ:Кстати, это всего лишь примерный случай, а не реальный, но это ясно отражается.Как будто все это плавающие/двойные числа и передаются каким-то другим методам.Но методы нужно знать, какой тип фруктов выполнять правильно.Сами по себе фрукты ничего не значат.

Это было полезно?

Решение

Прежде всего, значения перечисления не являются типами, поэтому пример

FruitList<float, FruitType.Orange>

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

FruitList<float, Orange>

даже если вы никогда не будете использовать Orange сорт.На мой взгляд, в этом, вероятно, нет необходимости, поскольку вы можете указать тип в имени переменной:

FruitList<float> orangeWeights = new FruitList<float>(FruitType.Orange);

Другие советы

FruitList<float>(FruitType.Orange) вероятно, это правильный путь.

float не может быть ничем, кроме параметра типа.Тип плода – это просто свойство.Нет смысла создавать отдельный тип и использовать для него параметры типа.

Зависит от того, будет ли твой апельсин просто похож на...ярлык...как Цвет.Автомобиль может быть синим и красным, но при этом оставаться «тем же самым».Если вы хотите, чтобы апельсин мог делать что-то особенное, отличное от обычного фрукта или яблока, я создаю абстрактный класс Fruit и подкласс Orange, а затем использую элемент <>.Если это просто тег, например цвет, то, я думаю, перечисление вполне подойдет.

Я думаю, что проще проверять типы и тому подобное, используя классы/структуры.Например, что произойдет, если кто-то попытается добавить фрукт типа яблока в ваш список фруктов?станет ли он апельсином?нужно ли будет проверять, был ли плод оранжевым?что бы произошло, если бы это было не так?аргумент-исключение?

Думаю, я бы пошел на занятия и <> все такое.Но это я.На самом деле, если бы это был я, думаю, я бы просто пошел дальше и использовал decimal для веса и всего остального, что нужно было измерить...а затем было что-то вроде (совершенно неправильный синтаксис и т. д., но, надеюсь, вы поняли):

class FruitList<TFruit> where TFruit : Fruit {}

abstract class Fruit {public abstract decimal Weight {get; protected set; }}

class Orange : Fruit { ... }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top