2010-05-25 7 views
14

프로그래밍을 조금 해본 후에 제 수업 중 하나에서 이전에 본 적이없는 방식으로 제네릭을 사용했습니다. 나쁜 코딩인지 아닌지에 대한 의견을 듣고 싶습니다.제네릭의 이상한 사용

abstract class Base<T> : where T : Base<T> 
{ 
    // omitted methods and properties. 
    virtual void CopyTo(T instance) { /*code*/ } 
} 

class Derived : Base<Derived> 
{ 
    override void CopyTo(Derived instance) 
    { 
     base.CopyTo(instance); 
     // copy remaining stuff here 
    } 
} 

제네릭을 사용 하시겠습니까? 아닙니다. 저는 주로 "그 자체"에 대한 제약을 생각하고 있습니다. 나는 때로는 generics가 Base 클래스를 사용하는 다른 클래스로 "폭발"할 수 있다고 생각한다.

+4

실제로 그것은 드문 일이 아니며 전에 본 적이 있습니다 ... –

+0

Generics가있는 것입니다. 인터페이스를 좀 더 추상화하기 위해 인터페이스를 노출 할 것입니다. –

+0

타입 T가베이스 으로 왜 필요한가요? 나는 당신의 견본에서 그 어떤 이유도 보지 못했고, 실제로 당신이 그것을 사용하는 이유를 알 수 없다. 내가 놓친 것이 무엇인가? –

답변

9

예, 이것은 합리적입니다. - 프로토콜 버퍼 포트에서 비슷한 점이 있습니다 (상호 참조 된 두 가지 유형이 있기 때문에 더 복잡함 제외).

가끔은 제네릭이 코드 기반으로 퍼져 나가는 것이 옳습니다. 여기서 한 것은 적절한 API가있는 Derived 만 신경 쓰는 코드가 제네릭에 대해 걱정할 필요가 없다는 것을 의미합니다 .

제 조언은 가능하면 간단하게 유지하려고하지만, "이상한"제네릭 제약이 실제로 원하는 것을 설명하는 경우에는 시도하십시오. 당신은이 아니지만 유효 사용한다는 것을 알고 있어야합니다 - 당신은 쉽게 할 수 :,

class Banana : Base<Derived> 

을하고는 유효 할 것이다 그러나 홀수 및 사용자 아마도 예기치.

Derived 여기에서 씰링을 고려할 수도 있습니다. 더 이상 파생한다면 이상한 행동 (또는 이상한 API)으로 끝날 가능성이 큽니다.

+0

Jon, 바나나 :베이스 이 실패합니까? 'where T : Base '? –

+1

@Filip Ekberg, 아니요, T ='Derived '이고'Derived'가'Base '입니다. –

+0

아 조금 이상하게 보였습니다. –

관련 문제