서브 클래스 타입의 매개 변수 인터페이스 메소드를 구현 어떻게해야합니까?C#을 나는이 원하는 클래스 계층이 한
답변
당신은 당신의 방법에 매개 변수로 ICLASS을 통과해야
interface IClass<T> where T : IClass<T>
{
string print(T item);
}
class MyClass : IClass<MyClass>
{
public string print(MyClass item)
{
return item.ToString();
}
}
사용자 인터페이스는 일반적인합니다.
interface IClass
{
string print(IClass item);
}
class MyClass : IClass
{
public string print(IClass item)
{ return item.ToString(); }
}
내 요구 사항은 MyClass의 인쇄 메소드가 다른 IClass 서브 클래스가 아닌 MyClass 매개 변수를 정확히 받아야한다는 것입니다. – Lio
지금은 구현이 아닌 인터페이스에 프로그래밍해야한다는 것을 무시하면됩니다. 다음 인터페이스에 문제가 있습니까? 인터페이스 IClass {string print (MyClass item); } – WPFAbsoluteNewBie
아무 것도. 괜찮아. 그러나 @Eric Lippert 아래서는 혼란 스럽다. – vcRobe
왜 이것이 불법인지 이해하는 것이 도움이됩니다. 원하는 기능은 형식 매개 변수 유형 공분산이며 매우 적은 언어로 제공됩니다. (에펠, 나는 이것을 특징으로 생각한다.) 안전하지 않기 때문에 언어에서 자주 발견되지 않는다! 예를 들어 설명해 드리겠습니다.
class Animal {}
class Lion : Animal { public void Roar() { } }
class Giraffe : Animal { }
interface IFoo { void M(Animal a); }
class C : IFoo
{
public void M(Lion lion) { lion.Roar(); }
}
class P
{
public static void Main()
{
IFoo foo = new C();
foo.M(new Giraffe());
}
}
그리고 우리는 방금 기린을 포효했습니다.
모든 유형 변환을 살펴보면 합법적으로 불법으로 만들 수있는 유일한 것은 C.M(Giraffe)
에서 IFoo.M(Animal)
까지입니다.
지금, 형식 매개 변수 유형 contravariance는 형태 보증이지만 아주 제한적인 경우를 제외하고 C#에서 불법입니다. C#이 지원하지 않는다면 다음과 같이 안전하게 할 수 있습니다.
interface IBar { void M(Giraffe g); }
class D : IBar
{
public void M(Animal animal) { ... }
}
class P
{
public static void Main()
{
IBar bar = new D();
bar.M(new Giraffe());
}
}
무슨 일이 있었는지 확인하십시오. IFoo.M은 "나는 기린을 가져갈 수있다"고 말하면서 C.M은 "실제로 어떤 동물도 받아 들일 수 있기 때문에 나는 어떤 기린도 받아 들일 수있다"고 말합니다. C#에서 지원하는 경우 형식이 안전하지만 두 가지 방식으로 만 지원됩니다.
- 반올림 범용 대리인 및 인터페이스 변환.
- 대리자 유형에 대한 반 변형 방법 그룹 변환. 기린를 비교하는 방법이 요구되는 경우 사용될 수 개의 동물을 비교하는 방법
제의 예는 타입 IComparable<Animal>
의 표현은 동일한 로직 타입 IComparable<Giraffe>
의 변수에 할당 될 수 있다는 . 이것은 C 번호 제
제의 예에서 첨가하는 단계이다
delegate void MyFunction(Giraffe g);
...
D d = new D();
MyFunction myfunc = d.M;
다시, 기린을 취하는 함수가 필요하고, 우리는 모든 동물을 얻어 하나를 공급한다. 이 기능은 C# 2에 추가되었습니다.
- 1. 나는이 같은 뷰 계층이 아이 뷰
- 2. 스칼라 - I는 다음의 클래스 계층이
- 3. C을 찾는 ++ 구현()`
- 4. ... 나는이 클래스 정의를 만든
- 5. 나는이 플러그인을 사용하고 클래스
- 6. 나는이 같은 클래스 정의가
- 7. 웹 서비스 계층이 유용할까요?
- 8. C/C을 찾고 ++ 언어와 표준 라이브러리 사양
- 9. 모듈이 나는 정도 객체/테이블을 원하는 나는이 오류가 OpenERP 7
- 10. 이 나는이 유사한 클래스 구조를 가지고 단정 한 쿼리
- 11. 나는이 한 시간
- 12. 나는이 플러그인을 설치 한
- 13. 나는이 벡터라는 이름의 한
- 14. 나는이 한 문제
- 15. 센터링 나는이 질문을 검토 한
- 16. lastInsertId는() 나는이 옵션 클래스 초기화
- 17. 나는이 코드 조각이 antoher 클래스
- 18. 나는이 더미 루비 클래스 파일이
- 19. 내 애플리케이션에 앱 계층이 없습니까?
- 20. Buddypress 템플릿 계층이 사용되지 않습니다.
- 21. Silverlight : 클라이언트/서버 계층이 필요합니까?
- 22. Google지도 KML 계층이 확대되지 않습니다
- 23. 나는이 간단한 문자열 변수에 저장 한 XSL
- 24. 컴파일 시간에 원하는 클래스 수로 상속을 제한
- 25. 내가이 같은 클래스 뭔가를 원하는 문자열
- 26. Apache JackRabbit 저장소에 대한 추상화 계층이 있습니까?
- 27. CouchDB를 : 나는이 문서가 만들어진 한
- 28. 윈도우 7 나는이 링크와 함께 수행 한
- 29. 중첩 따옴표 : 나는이 일을, 내가 확인 팝업을 원하는 제출 버튼이
- 30. 코드 지정자 라우팅. AJAX 나는이 CodeIgniter의 작업을 원하는 자바 스크립트
인터페이스 자체를 일반화하고 구현 클래스에 원하는 유형을 제공해야합니다. – Rik
print 메소드에서 매개 변수를 가지지 않고 각 하위 클래스가 IClass 구현을 생성자 또는 서터에 주입하도록하는 방법은 어떻습니까? –
toString 메서드는 Object에서 상속되므로, 왜'print (Object item)'뿐만 아니라'print (MyClass item)'을 정말로 필요로합니까? 이 방법을 숨기시겠습니까? – Thomas