繁体   English   中英

将“class1:interface1”类型的属性定义到另一个接口

[英]Defining a property of type 'class1 : interface1' into another interface

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

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.prop1因为它没有匹配的返回类型IpropTemplate

我该怎么办? 谢谢

你不能让你的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();

而不是C1,在属性签名中写入IPropTemplate。 在推测之后,您可以对C1类型进行操作,但签名必须公开接口,因为IclassTemplate以这种方式定义它。

做就是了

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM