2010-04-06 3 views
1

의 방법으로 부모 클래스의 하위 클래스를 사용하여,하지만 난 아래 쓸 때 :구현 내가 내 dev에 환경에 대한 액세스 권한이없는 인터페이스

interface IExample 
void Test (HtmlControl ctrl); 



class Example : IExample 
{ 
    public void Test (HtmlTextArea area) { } 

내가 방법을 알리는 오류 클래스 구현에서 인터페이스와 일치하지 않으므로 불가능합니다. HtmlTextArea는 HtmlControl의 하위 클래스이므로 이것이 가능하지 않습니다. .NET 3.5와 함께 시도했지만 .NET 4.0은 다를 수 있습니다 (두 프레임 워크 중 하나의 솔루션에 관심이 있습니다).

감사

찰스에 대한

답변

5
interface IExample<T> where T : HtmlControl 
{ 
    void Test (T ctrl) ; 
} 

public class Example : IExample<HtmlTextArea> 
{ 
    public void Test (HtmlTextArea ctrl) 
    { 
    } 
} 

참고 : 당신은 그렇지 않으면 당신은 자식 클래스에있는 메소드의 서명을 변경할 필요가 없습니다, 강력한 형식의 방법을 얻을 일반적인 사용하지만, 단지의 아이를 호출 할 수 있습니다 HtmlControl

+0

, 즉, 내가 할 수있는 인터페이스 오브젝트를하는 방법 서명 등 메소드에 대한 호출에서 자식 구현을 전달합니다. 나는이 예제에서 제네릭이 실제로 필요 없다고 생각했다. – dotnetdev

+0

@dotnetdev : 자식 클래스에서 메서드의 시그니처를 변경할 필요가 없습니다. HtmlControl'을 상속받은 자식을 Test 메서드에 전달하면이 테이블이나 앵커와 관계없이 작동합니다. 그것은 OOP의 주된 원리 중 하나입니다 - 다형성 – vittore

+0

이것은 잘못되었으며 허용 된 대답이되어서는 안됩니다. 이것은 컴파일되지 않습니다. 답변을 확인하고 수정하십시오. @ dotnetdev :이 대답을 받아들이는 것을 다시 생각해보십시오. 잘못이 아니라 설명이 전혀 없기 때문입니다. 이것은 미래의 독자들에게 도움이되지 않을 것입니다. –

6

어떤HtmlControl이든 전달할 수 있습니다.

var btn = new HtmlButton(); //inherits from HtmlControl as well 

IExample obj = new Example(); 
obj.Test(btn); //Uh oh, this *should* take any HtmlControl 
1

당신은 할 수 있습니다 당신은 HtmlTextArea을 말함으로써, 범위를 축소하는 것은 그래서 아니,이 :)

사진 추론이 예제를 할 수 없어, 전달 될 수있다 generics으로하십시오. 인터페이스에 HtmlControl 및 그 자식에 제약이있는 형식 매개 변수를 지정합니다. 그런 다음 구현에서 HtmlControl 또는 하위 클래스를 사용할 수 있습니다. 이 예에서 나는 HtmlControl을 사용하고 있습니다,하지만 난 테스트() 메소드를 호출하고있어 모두 HtmlControl과 HtmlTextArea :

public class HtmlControl {} 
public class HtmlTextArea : HtmlControl { } 

// if you want to only allow HtmlTextArea, use HtmlTextArea 
// here instead of HtmlControl 
public interface IExample<T> where T : HtmlControl 
{ 
    void Test(T ctrl); 
} 

public class Example : IExample<HtmlControl> 
{ 
    public void Test(HtmlControl ctrl) { Console.WriteLine(ctrl.GetType()); } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IExample<HtmlControl> ex = new Example(); 
     ex.Test(new HtmlControl()); // writes: HtmlControl    
     ex.Test(new HtmlTextArea()); // writes: HtmlTextArea 

    } 
} 
사고의 내 라인은