定义类型为'class1: interface1'转到另一个接口

本文关键字:接口 另一个 interface1 class1 类型 定义 | 更新日期: 2023-09-27 18:08:03

我有一些实现如下接口的类:

class C1 : IpropTemplate { ... }
class C2 : IpropTemplate { ... }
:

也有一些其他类实现另一个接口:

class C3 : IclassTemplate { ... }

现在,我需要在IclassTemplate中指定一个属性的签名,该签名强制C3具有从IpropTemplate实现的属性。(如C1C2等)

我试过了:

interface IclassTemplate
{
    ...
    IpropTemplate prop1 { get; set; }
}
class C3 : IclassTemplate
{
    ...
    public C1 prop1
    {
        get;
        set;
    }
}

在这种情况下,编译器产生一个错误,表明C3没有实现接口成员IclassTemplate.prop1, C3.prop1因为没有与IpropTemplate匹配的返回类型而不能实现IpropTemplate.prop1

我该怎么办?由于

定义类型为'class1: interface1'转到另一个接口

您不能让您的C3实现只在C1中处理—毕竟,您已经保证了这将是有效的:

IClassTemplate c3 = new C3();
c3.Template = new C2();

如果您只需要能够读取属性,则稍微容易一些:

interface IClassTemplate
{
    IPropTemplate Template { get; }
}
public class C3 : IClassTemplate
{
    private readonly C1 c1 = new C1();
    IPropTemplate Template { get { return c1; } }
}

C3中的代码知道它实际上是C1,但仍然实现接口。

另一个选择是使你的接口泛型:

interface IClassTemplate<T> where T : IPropTemplate
{
    T Template { get; set; }
}
public class C3 : IClassTemplate<C1>
{
    public C1 Template { get; set; }
}

希望其中一个能满足你的需求,如果不能,请给出更多的细节,说明你真正想要达到的目标——更大的图景。

返回类型是属性签名的一部分——它的类型必须是IpropTemplate:

public IpropTemplate prop1
{
    get;
    set;
}

那么你可以将它赋值给C1和C2对象。

...
prop1 = new C1();

在属性签名中使用IPropTemplate代替C1。之后,您可以在内部操作C1类型,但是签名必须公开一个接口,因为IclassTemplate以这种方式定义了它。

只管做

class C3 : IclassTemplate 
{
    ...
    public C1 prop1
    {
        get;
        set;
    }
   public IpropTemplate prop1 {get;set;}
}