Вопрос об дженериках (параметры типа и конструкторы)
Вопрос
Если у вас есть пользовательский класс коллекции, который хранит веса одного класса фруктов индивидуально в числах с плавающей запятой/двойной, например:
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 { ... }