C# 演员名单<;类别>;列出<;界面>;

C# 演员名单<;类别>;列出<;界面>;,c#,winforms,casting,C#,Winforms,Casting,我有两个接口。其中一个表示“Presenter”类(MVP模式)。它被称为IPresenter。 另一个接口表示具体Presenter类可以返回的对象之一。它被称为ipresenterement。 此IPresenter接口声明属性 BindingList<IPresenterElement> SourceList { get; } 编译器引发错误,告知具体类未实现接口属性。换句话说,它不能注意到人是一个ipresenterement 我怎样才能克服这种情况 必须准确地实现接口,不

我有两个接口。其中一个表示“Presenter”类(MVP模式)。它被称为
IPresenter
。 另一个接口表示具体Presenter类可以返回的对象之一。它被称为
ipresenterement
。 此
IPresenter
接口声明属性

BindingList<IPresenterElement> SourceList { get; }
编译器引发错误,告知具体类未实现接口属性。换句话说,它不能注意到人是一个
ipresenterement


我怎样才能克服这种情况

必须准确地实现接口,不能尝试更改返回类型。但是,您可以使界面通用

public interface IPresenter<T> where T: IPresenterElement 
{
    BindingList<T> SourceList { get; }
}
公共接口IPresenter,其中T:ipresenterement
{
BindingList源列表{get;}
}
然后在实现接口时指定具体类型

public class PeoplePresenter : IPresenter<People>
{
    public BindingList<People> SourceList { get; }
}
公共类人物演示者:IPresenter
{
公共BindingList源列表{get;}
}

一个简单的解决方案是将
IPresenter
界面变得通用:

public interface IPresenter<TPresenterElement> where TPresenterElement : IPresenterElement
{
    BindingList<TPresenterElement> SourceList { get; }

    // ...
}

public class PeoplePresenter : IPresenter<People>
{
    public BindingList<People> SourceList { get; }

    // ...
}
公共接口IPresenter,其中TPresenterElement:IPresenterElement
{
BindingList源列表{get;}
// ...
}
公共类人物演示者:IPresenter
{
公共BindingList源列表{get;}
// ...
}

问题是这是否真的有帮助。如果您需要非通用的
IPresenter
接口,那么除了在每个具体实现上都有
BindingList
属性并处理与实际数据的同步(例如
List

展示人物类的实现将英文括号标记为
code
,这样他们就不会被吃掉了。。!C#仅支持接口和委托的差异,而不支持类的差异。因此,
BindingList
永远不会是
BindingList
,无论
人与
ipresenterement
之间的关系如何。您必须准确地实现一个接口,不能尝试更改参数或返回类型。但是,您可以将接口设置为泛型,并指定泛型类型必须是
iPresentRelement
,然后您的类可以在实现接口时为泛型类型指定
People
。@juharr我知道这一点;但该属性引用的是一个接口。因此,我(当然是错误地)认为,如果具体属性引用了该接口的具体实现,那么它将工作。“我没那么笨。”Zdenëk Jelinek,谢谢你。我会试试你的方法
public interface IPresenter<TPresenterElement> where TPresenterElement : IPresenterElement
{
    BindingList<TPresenterElement> SourceList { get; }

    // ...
}

public class PeoplePresenter : IPresenter<People>
{
    public BindingList<People> SourceList { get; }

    // ...
}