제네릭 질문 (유형 매개 변수 대 생성자)
문제
단일 클래스의 과일의 무게를 플로트/더블에 개별적으로 저장하는 사용자 정의 컬렉션 클래스가있는 경우 :
1.1, 3.3, 6.6, 4.4, ...
또한 플로트인지 이중인지를 지정하고 과일 유형을 차별화하려면 다음과 같이하는 것이 좋습니다.
열거 사용 :
FruitList<float, FruitType.Orange>
또는
생성자에 열거를 사용 :
FruitList<float> (FruitType.Orange)
또는
수업 사용 :
FruitList<float, Orange>
또는
생성자에서 클래스 사용 :
FruitList<float> (Orange)
나를 혼란스럽게하는 것은 이런 종류의 물건을 지정하는 것이 <> 지역에서 의미가 있는지 여부입니다 (해당 영역이 무엇인지 모릅니다)?
어느 것이 더 좋고, 빠르고, 더 효율적인 연습입니까?
BTW Orange 클래스는 어디서나 사용되지 않습니다. 그냥 유형을 지정하는 것이 합리적이라면 작성 했습니까?
편집 : BTW 이것은 실제 사례가 아니라 예제 일 뿐이지 만 이것은 명확한 방식으로 반영됩니다. 모든 부유물/복식처럼 다른 방법으로 전달됩니다. 그러나 방법은 올바르게 수행 할 과일 유형을 알아야합니다. 과일 자체는 아무 의미가 없습니다.
해결책
우선, 열거 값은 유형이 아니므로 예제
FruitList<float, FruitType.Orange>
작동하지 않습니다. 일반 목록이 정적으로 입력한지 확인하려면 Orange
당신은 이것을 사용해야합니다
FruitList<float, Orange>
당신은 결코 사용하지 않더라도 Orange
수업. 내가 알 수 있듯이 변수 이름으로 유형을 전달할 수 있기 때문에 필요하지 않을 것입니다.
FruitList<float> orangeWeights = new FruitList<float>(FruitType.Orange);
다른 팁
FruitList<float>(FruitType.Orange)
아마가는 길 일 것입니다.
float
유형 매개 변수를 제외하고는 아무것도 될 수 없습니다. 과일 유형은 단지 재산 일뿐입니다. 별도의 유형을 만들고 유형 매개 변수를 사용하는 것은 의미가 없습니다.
당신의 오렌지가 단지 ... 태그 ... 색상처럼 될 것인지에 따라 다릅니다. 자동차는 파란색과 빨간색 일 수 있으며 여전히 "동일한"자동차 일 수 있습니다. 오렌지가 평범한 과일이나 사과와 다른 특별한 일을 할 수 있기를 원한다면, 나는 추상 과일 클래스와 하위 클래스 오렌지를 만들고 <>를 사용합니다. 색상과 같은 태그가 있으면 열거가 잘할 수 있습니다.
그래도 클래스/structs를 사용하여 유형 검사 등이 더 쉽다고 생각합니다. 마찬가지로, 누군가가 당신의 과일 목록에 사과 유형의 과일을 추가하려고하면 어떻게 될까요? 오렌지가 될까요? 과일의 과일 유형이 주황색인지 확인해야합니까? 그렇지 않으면 어떻게 될까요? ArgumentException?
나는 수업을 위해 갈 것이라고 생각합니다. 그러나 그것은 나입니다. 사실 그것이 나라면, 나는 방금 갔을 것 같아요 decimal
측정 해야하는 무게와 다른 모든 것에 대해 ... 그리고 (완전히 잘못된 구문 등이 있지만, 당신은 희망적으로 아이디어를 얻습니다) :
class FruitList<TFruit> where TFruit : Fruit {}
abstract class Fruit {public abstract decimal Weight {get; protected set; }}
class Orange : Fruit { ... }