Универсальный вопрос (Типовые параметры против Конструкторов) - PullRequest
0 голосов
/ 02 марта 2009

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

1.1, 3.3, 6.6, 4.4, ...

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

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

FruitList<float, FruitType.Orange>

или

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

FruitList<float> (FruitType.Orange)

или

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

FruitList<float, Orange>

или

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

FruitList<float> (Orange)

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

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

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

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

Ответы [ 3 ]

1 голос
/ 02 марта 2009

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

FruitList<float, FruitType.Orange>

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

FruitList<float, Orange>

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

FruitList<float> orangeWeights = new FruitList<float>(FruitType.Orange);
1 голос
/ 02 марта 2009

FruitList<float>(FruitType.Orange), вероятно, путь.

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

0 голосов
/ 02 марта 2009

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

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

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

class FruitList<TFruit> where TFruit : Fruit {}

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

class Orange : Fruit { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...