代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

在接口方法中使用父类的子类时接口的实现

c#
  •  1
  • GurdeepS  · 技术社区  · 14 年前

    我没有访问我的dev环境的权限,但是当我写下以下内容时:

    interface IExample
     void Test (HtmlControl ctrl);
    
    
    
     class Example : IExample
     {
         public void Test (HtmlTextArea area) { }
    

    我得到一个错误,说明类实现中的方法与接口不匹配,所以这是不可能的。htmlTextArea是htmlControl的子类,这是不可能的吗?我尝试使用.NET 3.5,但.NET 4.0可能有所不同(我对任何一种框架的解决方案都感兴趣)。

    谢谢

    3 回复  |  直到 14 年前
        1
  •  6
  •   vittore    14 年前
    interface IExample<T> where T : HtmlControl
    {
        void Test (T ctrl) ;
    }
    
    public class Example : IExample<HtmlTextArea>
    {
        public void Test (HtmlTextArea ctrl) 
        { 
        }
    }
    

    查尔斯注意: 可以使用generic获取强类型方法,否则不需要更改子类中方法的签名,只需使用 HtmlControl

        2
  •  6
  •   Nick Craver    14 年前

    在界面上,它说 任何 HtmlControl 可以通过。你是 缩小 范围,只说一个 HtmlTextArea 可以传入,所以不能,您不能这样做:)

    想象一下这个推理的例子:

    var btn = new HtmlButton(); //inherits from HtmlControl as well
    
    IExample obj = new Example();
    obj.Test(btn); //Uh oh, this *should* take any HtmlControl
    
        3
  •  1
  •   Igby Largeman    14 年前

    你可以用 generics . 为接口提供一个类型参数,该参数被约束为htmlcontrol及其子级。然后在实现中,您可以使用htmlcontrol或子代。在本例中,我使用的是htmlcontrol,但我使用htmlcontrol和htmltextarea调用test()方法:

    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
    
        }
    }