通用接口和继承

时间:2016-06-19 02:54:00

标签: c# generics inheritance

我有一个看起来像这样的基本界面

public interface IBaseWidget<T> where T: IBaseConfiguration
{
   void Configure(T configuration);
}

然后,我的子接口看起来像这样:

public interface ISpecificWidget : IBaseWidget<IChildSpecificConfiguration>
{
}

IChildSpecificConfiguration实现IBaseConfiguration然后我有类似

的类
public class SomeClass : ISpecificWidget
{
    public void Configure(IChildSpecificConfiguration configuration)
    {
        //do stuff
    }
}

这一切都很好,我们会回到这里。

它开始崩溃的地方是IBaseWidget<T>有几个不同的扩展名,这意味着有几个不同的SomeClass。另外SomeClass只能通过外观进行访问,因此,基于一堆规则,我有一个基本外观,实际上创建了必要的SomeClass的实例。在如上所示制作IBaseWidget泛型之前,我的基本外观如下所示:

public abstract class BaseFacade<T> where T IBaseWidget
{
     T Widget {get;set;}
     private void Init()
     {
        Widget = (T)Activator.CreateInstance("type");
     }
}

IBaseFoo的每个实现的外观如下所示:

public sealed class SomeFacade : BaseFacade<ISpecificWidget>
{
    private void DoSomething()
    {
       Widget.DoSomething();
    }
}

再次,这很好。我的问题是这样的:在IBaseWidget泛型之后我修改了基本外观,如下所示:

public abstract class BaseFacade<T> where T : IBaseWidget<IBaseConfiguration>
{
     T Widget {get;set;}
     IBaseConfiguration configuration; //IChildSpecificConfiguration passed in via constructor and assigned to variable
     private void Init()
     {
        Widget = (T)Activator.CreateInstance("type");
        Widget.Configure(configuration)
     }
}

这打破了SomeFacade的上述声明,并带有以下消息:

  

ISpecificWidget必须可转换为IBaseWidget<IBaseConfiguration>

我的期望是,当我如此定义ISpecificWidget时:

public interface ISpecificWidget : IBaseWidget<IChildSpecificConfiguration>
{
}

它可以转换为IBaseWidget,但事实并非如此。我知道我可以通过为每个特定的小部件实现提供基础来解决这个问题,但我试图尽可能保持通用。任何反馈将不胜感激。

1 个答案:

答案 0 :(得分:0)

也许这可以解决你的问题。

添加此界面:

public interface IBaseWidget
{
    void Configure(IBaseConfiguration configuration);
}

然后继承它:

public interface IBaseWidget<T> : IBaseWidget
    where T : IBaseConfiguration
{
    void Configure(T configuration);
}

最后:

public abstract class BaseFacade<T> where T : IBaseWidget
{
    T Widget { get; set; }
    IBaseConfiguration configuration; //IChildSpecificConfiguration passed in via constructor and assigned to variable
    private void Init()
    {
        Widget = (T)Activator.CreateInstance(typeof());
        Widget.Configure(configuration);
    }
}

public class SomeClass : ISpecificWidget
{
    void IBaseWidget.Configure(IBaseConfiguration configuration)
    {
        throw new NotImplementedException();
    }

    public void Configure(IChildSpecificConfiguration configuration)
    {
        //do stuff
    }
}