2009-09-11 5 views
3

나는 마침내 제약 조건을 얻었지만 여전히 혼란 스럽다고 생각한다. 누군가 다음이 옳은지 말해 줄 수 있습니까?제약 조건을 이해하려고 노력 중 - 올바른 방향으로 가고 있습니까?

기본적으로 클래스를 상속하는 경우 상속 한 클래스가 다른 클래스 또는 다른 인터페이스에서도 상속 받도록 할 수 있습니다.

당신이 원했던 것을 상속 받고 싶다는 것을 알고 있기 때문에 혼란 스러울 것입니다.하지만 제네릭을 사용하면 한 지점에서 컴파일 오류를 얻을 수 있고 문제가 실제로 발생한다는 것을 모를 수 있습니다 일부 클래스가 다른 곳에서 상속되지 않는다는 사실과 올바른 영역에 제약 조건을 추가하면 오류가 발생할 수 있습니다.

의미가 있습니까? 나는 올바른 길을 가고 있는가?

답변

4

나는 이것이 제약 조건이라고 생각하지 않는다. (그러나 나는 틀릴 수도있다.)

제가 알기에 제약 조건은 상속 자체와는별로 관련이 없습니다. 당신이 정말로하고있는 것은 타입 인자를 가진 클래스를 사용 (인스턴스화)하고 있다면 사용할 수있는 타입에 제약을 가하는 것이다. 형태 인수를 가지는

수업은 미친-libs와 같은, 그리고 제약은 공백 아래에 나타나는 지시 같다 ". 밥 매일 밤 친구들과 ______ 좋아"

가 (그건 엄마 야)

"Bob은 매일 밤 친구들과 _ (동사) ___ (지침이있는 madlib)을 좋아합니다."

확인이 :

//class with type arguments 
public class MadLib<W> { 
    public void addWord(W word) { 
     System.Console.WriteLine("bob likes to " + word + " with his friends"); 
    } 
} 


//class with type arguments and contraints (note i'm not inheriting nothin) 
public class MadLib<W> where W:Verb{ 
    public void addWord(W word) { 
     System.Console.WriteLine("bob likes to " + word + " with his friends"); 
    } 
} 
+0

감사합니다. 모든 대답은 매우 도움이되었습니다. 특히 마들 리오 비유를 좋아합니다! – NobodyMan

0

만하지만 여러 인터페이스를 구현할 수 있습니다, 하나 개의 클래스에서 상속 할 수 있습니다. 상속이란 기본 클래스가 지정하는 속성 및 메서드를 클래스가 가져오고 (상속 받음) 의미합니다. 클래스가 비공개로 표시되어 있지 않으면 상속 클래스는 해당 메소드를 자신의 것으로 호출 할 수 있습니다.

2

아니요. 제약 조건은 일반 클래스 템플릿을 정의 할 때만 적용됩니다 (클래스에서 상속 한 경우 이 아닌).

제네릭을 정의 할 때이 패턴을 기반으로 다른 곳에서 만들어지는 아직 알 수없는 Type, T가있는 아직 정의되지 않은/알 수없는 클래스에 대해 이것이 "템플릿"또는 패턴이라고 말합니다 그리고 명시 적으로 제공 유형 T.와 T가 다른 장소에서 사용할 수있는 유형 제약 제한은 실제로

//Define the generic here, with arbitrary type T 
public class MyClass<T> where T: SomeOtherClass 
    { 
    // template/pattern methods, proerpties, fields, etc. 
    } 

것은 여기에 실제 클래스를 만들기에 같이 템플릿/패턴

에서 실제 유형을 만들 경우 명시 적으로 제공되는 유형 "DerivedClass"

DerivedClass이
4

정확 하 SomeOtherClass

에서 상속의 경우에만 성공

public MyClass<DerivedClass> myC = new MyClass<DerivedClass>(); 
. 제약 조건은 제네릭 매개 변수가 제시 할 수있는 동작 및/또는 유형을 지정하는 데 사용됩니다.예를 들어

, 당신은 클래스 선언하는 경우 :

class GenericDisposableHandler<T> 
{ 
    public void DoOperationOnT(T someVariable) 
    { 
     // can't really do much with T since its just an object type 
    } 
} 

및 일반 매개 변수 T는 항상는 IDisposable을 구현 뭔가를해야한다는 사실을 알고, 당신이 할 것 :이

class GenericDisposableHandler<T> where T : IDiposable 
{ 
    public void DoOperationOnT(T someVariable) 
    { 
     // Now you can treat T as IDisposable 
     someVariable.Dispose(); 
    } 
} 

many other constraint types you can use입니다.

관련 문제