프로그램을 계획 할 때 종종 다음과 같은 생각으로 시작합니다.
축구 팀은 축구 선수 목록입니다. 따라서 다음과 같이 표현해야합니다.
var football_team = new List<FootballPlayer>();
이 목록의 순서는 선수가 명단에 나열되는 순서를 나타냅니다.
그러나 나중에 팀에는 단순한 플레이어 목록 외에도 기록해야 할 다른 속성이 있다는 것을 알고 있습니다. 예를 들어, 이번 시즌의 총 점수, 현재 예산, 균일 한 색상, string
팀 이름을 나타내는 등
그래서 나는 생각합니다 :
풋볼 팀은 선수 목록과 비슷하지만, 이름 (a
string
)과 총점 (anint
) 을가 집니다. .NET은 풋볼 팀을 저장하기위한 수업을 제공하지 않기 때문에 나만의 수업을 만들 것입니다. 가장 유사하고 관련성이 높은 기존 구조는입니다List<FootballPlayer>
.class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
그러나 지침에 따르면 상속해서는 안됩니다List<T>
. 나는이 지침에서 두 가지 측면에서 완전히 혼란스러워합니다.
왜 안돼?
분명히 List
성능에 최적화되어 있습니다. 어떻게 요? 연장하면 어떤 성능 문제가 발생 List
합니까? 정확히 무엇을 깰까요?
내가 본 또 다른 이유 List
는 Microsoft에서 제공 한 것이므로이를 제어 할 수 없으므로 "public API"노출 후 나중에 변경할 수 없습니다 . 그러나 나는 이것을 이해하려고 노력합니다. 공개 API 란 무엇이며 왜 관심을 가져야합니까? 현재 프로젝트에이 공용 API가 없거나 포함되어 있지 않을 경우이 지침을 무시해도됩니까? 상속을 List
받고 공개 API가 필요한 것으로 밝혀지면 어떤 어려움이 있습니까?
왜 중요합니까? 리스트는리스트입니다. 무엇이 변경 될 수 있습니까? 무엇을 바꾸고 싶습니까?
마지막으로, Microsoft가 내가 상속받지 않기를 원한다면 List
왜 수업을하지 않았 sealed
습니까?
내가 무엇을 사용해야합니까?
분명히, 사용자 지정 컬렉션을 위해 Microsoft는 Collection
대신에 확장해야하는 클래스를 제공했습니다 List
. 그러나이 클래스는 매우 나쁘고 예를 들어와 같은AddRange
유용한 것들이 많지 않습니다 . jvitor83의 대답 은 특정 방법에 대한 성능 이론적 근거를 제공하지만 느리게는 AddRange
아니지 않은 방법은 AddRange
무엇입니까?
에서 상속하는 Collection
것이 에서 상속하는 것보다 훨씬 많은 작업이며 List
이점이 없습니다. 분명히 Microsoft는 아무런 이유없이 추가 작업을 수행하도록 지시하지 않으므로 어떻게 든 무언가를 오해하고 있다고 느끼는 것을 도울 수 없으며 상속 Collection
은 실제로 내 문제에 대한 올바른 해결책이 아닙니다.
구현과 같은 제안을 보았습니다 IList
. 안돼. 이것은 아무것도 얻지 못하는 수십 줄의 상용구 코드입니다.
마지막으로, 일부는 List
무언가를 감싸는 것이 좋습니다 .
class FootballTeam
{
public List<FootballPlayer> Players;
}
이것에는 두 가지 문제가 있습니다 :
내 코드를 불필요하게 장황하게 만듭니다. 이제
my_team.Players.Count
그냥 대신에 전화해야합니다my_team.Count
. 고맙게도 C #을 사용하면 인덱서를 정의하여 인덱싱을 투명하게 만들고 내부의 모든 메소드를 전달할 수 있습니다List
...하지만 많은 코드입니다! 그 모든 일을 위해 무엇을 얻습니까?그냥 평범하지 않습니다. 풋볼 팀은 선수 목록을 가지고 있지 않습니다. 그것은 이다 플레이어의 목록입니다. "John McFootballer가 SomeTeam의 플레이어에 합류했습니다"라고 말하지 않습니다. "John이 SomeTeam에 가입했습니다"라고 말합니다. "문자열 문자"에 문자를 추가하지 않고 문자열에 문자를 추가합니다. 책을 도서관의 책에 추가하지 않고 책을 도서관에 추가합니다.
"후드에서"발생하는 일이 "Y의 내부 목록에 X 추가"라고 말할 수 있지만, 이것은 세상에 대해 매우 반 직관적 인 사고 방식처럼 보입니다.
내 질문 (요약)
"논리적"( "인간의 마음에"라고하는 것입니다)이 단지 인 데이터 구조, 표현의 올바른 C #을 방법은 무엇입니까 list
의 things
몇 종과 경적은?
상속은 List<T>
항상 허용되지 않습니까? 언제 받아 들일 수 있습니까? 왜 왜 안돼? 상속 여부를 결정할 때 프로그래머가 고려해야 할 사항은 무엇입니까 List<T>
?
string
모든 것을 할 필요 object
할 수 있습니다 더 .