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

时间:2011-09-10 06:39:34

标签: c#

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

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

我该怎么办? 感谢

4 个答案:

答案 0 :(得分:2)

你无法在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; }
}

希望其中一个能够满足您的需求 - 如果没有,请详细说明您真正想要达到的目标 - 更大的图景。

答案 1 :(得分:0)

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

public IpropTemplate prop1
{
    get;
    set;
}

然后你可以将它分配给C1和C2对象。

...
prop1 = new C1();

答案 2 :(得分:0)

而不是C1,在属性签名中写入IPropTemplate。在神秘之后你可以对C1类型进行操作,但签名必须暴露一个接口,因为IclassTemplate以这种方式定义它。

答案 3 :(得分:0)

只做

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