2009-09-09 4 views
5

좋아요, 그 제목은 약간 불분명하지만, 그것을 설명하는 것 외에 다른 방법보다 더 좋은 방법을 생각할 수는 없습니다 ...상속 정적 메서드에서 클래스 컨텍스트를 검색 할 수 있습니까?

정적 인 일반적인 방법으로 Animal 클래스가 있다고 해봅시다.

public static T Create<T>() where T : Animal { 
    // stuff to create, initialize and return an animal of type T 
} 
그리고 Dog, Cat, Hamster 등등 서브 클래스가 있습니다. Dog을 얻으려면 다음과 같이 작성할 수 있습니다.

Dog d = Animal.Create<Dog>(); 

또는

Dog d = Dog.Create<Dog>(); 

이것은 실제로 똑같습니다. 하지만 Dog 서브 클래스를 통해 이미 정적 메서드를 호출하고 있으므로 Dog를 여러 번 작성해야하는 것은 바보 같습니다.

기본 클래스에 Create() 메서드를 작성하는 영리한 방법을 생각하면 각 하위 클래스에 Create() 메서드를 작성하지 않고

Dog d = Dog.Create(); 
Cat c = Cat.Create(); 
Hamster h = Hamster.Create(); 

를 호출 할 수 있습니까?

답변

10

Animal 클래스를 일반으로 만들 수 있습니다.

class Animal<T> where T : Animal<T> 
{ 
    public static T Create() 
    { 
     // Don't know what you'll be able to do here 
    } 
} 

class Dog : Animal<Dog> 
{ 

} 

그러나 Animal 클래스가 파생 된 형식의 인스턴스를 생성하는 방법을 알고하는 방법?

+2

'T'를 Animals로 제한하고 싶을 것입니다 :'class Animal T : Animal ' – dtb

+0

@dtb : 물론입니다! 응답이 업데이트되었습니다. –

+0

Create() 내의 코드는 가상/추상 메서드를 호출하므로 파생 된 형식의 인스턴스를 만드는 방법입니다. –

2

정적 인 Create 메서드를 사용하여 Animal 클래스를 추상화합니다. 그것은 사실 공장의 출발점입니다. 실제로 팩토리 클래스를 취소하는 것처럼 보입니다. 당신이 동물 클래스에 추상 초기화 방법을 추가하는 경우

는 작성 방법이된다 :

주위 방법에 대한 다른 답변에 추가
public static T Create<T>() where T : Animal { 
    T animal = new T(); //may need a "new" in the declaration 
    animal.Initialize(); //or Create or whatever or you put this logic 
         // in the constructor and don't call this at all. 
    return animal; 
} 
+0

동물 수 없습니다 정적 클래스 여야합니다.그러나 파생 된 각 유형에 생성을 위임하려면 Animal abstract를 만드는 것이 좋습니다. 가상 대신에 Initialize 메서드를 사용하는 것이 좋습니다. –

+0

잘자요. 그것은 의도가 아니 었습니다. –

+0

@Romain - 글쎄, 내 대답을 조정했습니다. –

1

, 당신은 항상 만들고 그 반사를합니다 사용하여 볼 수 있습니다 여전히 파생 된 클래스가 아닌 Animal의 일부가됩니다.

관련 문제