从泛型类型继承为接口

biz*_*dee 7 c# generics inheritance

我试图做类似的事情:

public interface IView<T> : T where T : class 
{ 
    T SomeParam {get;} 
}
Run Code Online (Sandbox Code Playgroud)

这样我以后就可以了

public class SomeView : IView<ISomeView> 
{
}
Run Code Online (Sandbox Code Playgroud)

是否有可能以这种方式使用泛型指定继承,或者我必须走很长的路并在定义类时显式指定两个接口并执行:

public interface IView<T> 
{ 
    T SomeParam {get;} 
}
public class SomeView : IView<ISomeView>, ISomeView 
{
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*ish 0

简短回答:这是不可能的。看这个帖子

接口不能从class. 然而,没有什么可以阻止你这样做:

public interface ISomeView
{
}

public interface IView<out T> where T:class 
{
    T SomeParam { get; }
}

public class SomeView:IView<ISomeView>
{
    public ISomeView SomeParam { get; set; }
}    
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您不想T SomeParam { get; }每次需要实施时都实施,这可行吗?

public interface ISomeView
{
}

public abstract class BaseView<T> where T : class
{
    public T SomeParam { get; set; }
}

public class SomeView : BaseView<ISomeView>{
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,这都有效:

public class main
{
    public class OneOfThoseView : ISomeView
    {
    }

    public main()
    {
        OneOfThoseView oneOfThose = new OneOfThoseView();
        SomeView x = new SomeView();
        x.SomeParam = oneOfThose;
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑2:不完全是你想要做的,但这会迫使你的 SomeView 类返回一个BaseView<SomeView>

public interface ISomeView
{
}

public abstract class BaseView<T> where T : BaseView<T>
{
    public T SomeParam { get; set; }
}

public class SomeView : BaseView<SomeView>
{
}
Run Code Online (Sandbox Code Playgroud)

现在只有这个可行。

public main()
{
    SomeView y= new SomeView ();
    SomeView x = new SomeView();
    x.SomeParam = y;
}
Run Code Online (Sandbox Code Playgroud)