2011-01-19 6 views
5

몇 가지 클래스 구조 도움말을 찾고 있습니다. 말하자면 Dog라고 불리는 클래스가 있다고하면 (이름, 체중, 타입) 개에 대한 정보를 보유하고 있지만, 개가 여러 개있을 수 있기 때문에 전체 프로젝트에서 사용하기 위해 모든 개를 보유 할 클래스를 원합니다. 이 일을하는 가장 좋은 방법은 무엇일까요?목록의 클래스 구조 클래스?

DogList 클래스를 가지고 있으면 Dog 클래스 정보가 공용 목록에 저장됩니까? 의지대로 검색 할 수 있습니까?

목록이 원본 개 클래스의 정적이어야합니까? 어쩌면 생성자에서 누군가가 새 개를 만들면 개가 정적 목록에 추가됩니까?

편집 : 죄송하지만 처음으로 약간의 실수가있었습니다. 구현 방법이 더 좋은지 궁금합니다.

public class Dog 
{ 
    public string name{get;set;} 
    public int weight { get; set; } 
} 

public class DogFactory //not sure if thats the correct wording 
{ 
    public List<dog> lstDogs = new List<dog>(); 
    public void setDogs() 
    { 
    Animal.Retrieve("Dog"); 
    //will retrieve a list of all dogs, with details, though this is costly to use 
     foreach(Animal.Dog pet in Animal._Dogs) 
     { 
      Dog doggie = new doggie(); 
      doggie.Name = pet.Name; 
      ...etc 
      lstDog.add(doggie); 
     } 
    } 
} 
+3

"여러 개의 개가있을 수 있습니다"라고 말하면 '개가 여러 개있는 경우'또는 '여러 종류의 개'를 의미합니까? – yasouser

+0

미안, 개 클래스의 여러 인스턴스 – Spooks

답변

5

개 목록을 작성하는 가장 쉬운 방법은 다음과 같습니다

List<Dog>

이 System.Collections.Generic에서 List<T> 클래스를 사용하여 개의 강력한 형식의 목록입니다. 당신이 목록 개의 아닌 개를 자신에게 특별히 속성을 추가하려는 경우가 아니면이 필요는 아니지만

public class DogList : List<Dog>

:이 클래스를 만들 수 있습니다.

UPDATE :

당신은 일반적으로 List<T>를 사용할 때 전용 목록 클래스를 만들 필요가 없습니다. 당신이 당신의 데이터를 얻을 수 LINQ를 사용하는 경우, 당신은 List<T>을 반환 ToList() 확장을 사용할 수에서 파생되는 클래스를 만들 그래서 아무 필요

public class DogService 
{ 
    public List<Dog> GetAllDogs() 
    { 
     var r = new Repository(); // Your data repository 
     return r.Dogs.ToList(); // assuming your repository exposes a 'Dogs query' 
    } 
} 

: 대부분의 경우,이 작업을 수행 할 수 있습니다 List<T>.

+0

나는 개 목록을 만드는 방법을 알고, 나는 그것을 어디에서 만들 수 있는지 모르므로 프로젝트의 모든 클래스에 액세스 할 수 있습니다. 이 클래스는 자체 클래스 또는 개 클래스 내에서 목록을 설정하는 메서드가 필요합니다. – Spooks

+1

일반 목록은 모든 곳에서 선언 할 필요가 없으므로 편리합니다. 내 프로젝트에서 뭔가 (청구서, 사용자, 무엇이든)의 목록이 필요할 때 List 의 속성이나 메소드를 공개합니다. 여기서 T는 반환하려는 유형입니다. 개 목록을 반환하는 서비스가있는 경우이 메서드는 List 을 반환합니다. 리스트 박스 또는 개가 가득 찬 눈금이있는 뷰를 지원하는 ViewModel이 있다면 속성을 만들거나 List 을 입력하고 컨트롤을 해당 속성에 바인딩하십시오. –

+1

PS- 유일한 요구 사항은 프로젝트에 'T'유형에 대한 참조가 있으며 목록에 입력하려는 유형이 무엇이든간에. 그런 다음 일반 목록을 사용하여 해당 유형을 캡슐화하고 List (추가, 삽입, 제거 등)과 함께 제공되는 모든 기능을 사용할 수 있습니다. –

3

글쎄, C#은 이미 완벽하게 좋은 List<> 클래스를 가지고 있으므로 매우 구체적인 요구 사항이 없으면 새로운 DogList 클래스를 사용하지 않을 것입니다. 생성 된 모든 Dog를 추적해야하는 경우 dog 클래스의 정적 목록이 좋습니다. 그냥 private을 유지하고 개를 추가하거나 검색하는 방법이 있는지 확인하십시오. 더 나은 아직, 당신의 개 공장 당신을 위해 목록에 추가 할 수 있습니다 (나는 당신이 자신을 언급 한 것을 보았습니다).

+0

개 공장? 그게 개 수업 밖에있는 수업을 의미합니까? – Spooks

+0

반드시 그런 것은 아니지만 Dog 클래스의 정적 메서드 일 수 있습니다. – Tesserex

1

또는 원래의 개 클래스 내에서 목록이 정적이어야합니까? 어쩌면 생성자에서 누군가가 새 개를 만들면 개가 정적 목록에 삽입됩니까?

이 솔루션은 단일 스레드 응용 프로그램에서 작동합니다,하지만 all the dangers of global variables에 노출 될 것입니다.

* : Dog 클래스에 호출자가 런타임에 생성 한 모든 개 목록이 포함되어있는 것이 적절한 경우는 언제입니까? 발신자가 Dog 인스턴스의 할당을 해제하면 어떻게 될까요?

대신 개 목록을 사용하는 발신자는 발신자에게 개 목록을 만들고 관리해야합니다. 이러한 발신자는 목록의 올바른 수명을 알게 될 것이며, 목록에 포함 된 내용을 제어 할 수있을뿐만 아니라 코드를 읽는 사람에게 무슨 일이 일어나고 있는지를 분명히 알 수 있습니다.

* 목록이 작성된 개 로그가 아닌 경우.

+0

매우 훌륭합니다. 나는 그것이 합리적이라고 생각하지 않았다. 당신은 내가 마침내 그것을 만든 방법을 볼 수 있습니다 (분명히 실제로는 개를 사용하지 않고 조금 단순화했습니다) – Spooks

관련 문제