이것은 구문 질문입니다. 제네릭 기본 클래스에서 상속되고 형식 매개 변수 중 하나에 제약 조건을 적용하는 제네릭 클래스가 있습니다. 또한 파생 클래스가 인터페이스를 구현하기를 원합니다. 내 인생에서 올바른 구문을 알아낼 수없는 것 같습니다.
이것이 내가 가진 것입니다.
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }
가장 먼저 떠오른 것은 다음과 같습니다.
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }
그러나 이는 T2가 IBar와 IFoo를 모두 구현해야하므로 DerivedFoo가 IFoo를 구현하는 것이 아니기 때문에 올바르지 않습니다.
나는 약간의 인터넷 검색, 콜론, 세미콜론 사용 등을 시도했지만 짧게 나타났습니다. 대답은 매우 간단합니다.
답변
일반 제약 조건을 정의하기 전에 클래스의 전체 서명을 포함합니다.
class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
{
...
}
답변
내 추천 : C # 언어의 구문에 대한 질문이 있으면 사양을 읽으십시오. 그것이 우리가 그것을 출판하는 이유입니다. 섹션 10.1을 읽고 싶을 것입니다.
특정 질문에 답하기 위해 클래스 선언의 순서는 다음과 같습니다.
- 속성, 대괄호 안에
- 수정 자 ( “공용”, “정적”등)
- “일부”
- “수업”
- 클래스 이름
- 꺾쇠 괄호 안에 쉼표로 구분 된 유형 매개 변수 선언 목록
- 콜론 뒤에 쉼표로 구분 된 기본 유형 목록 (기본 클래스 및 구현 된 인터페이스가있는 경우 기본 클래스가 먼저 가야 함)
- 유형 매개 변수 제약
- 중괄호로 둘러싸인 클래스 본문
- 세미콜론
해당 목록의 모든 항목은 “클래스”, 이름 및 본문을 제외하고 선택 사항이지만 표시되는 경우 모든 항목이 해당 순서로 나타나야합니다.
답변
public interface IFoo {}
public interface IBar {}
public class ParentFoo<T,T1> { }
public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { }
답변
public class KeyAndValue<T>
{
public string Key { get; set; }
public virtual T Value { get; set; }
}
public class KeyAndValue : KeyAndValue<string>
{
public override string Value { get; set; }
}
이것은 기존 답변의 확장입니다. string
유형을 제공하지 않으면 기본값으로 설정 됩니다. 나는 인터페이스를 구현하지 않았지만 평소와 다른 것을 요구해서는 안됩니다.