我有一些实现接口的类如下:
class C1 : IpropTemplate { ... }
class C2 : IpropTemplate { ... }
:
还有一些其他类实现了另一个接口:
class C3 : IclassTemplate { ... }
现在,我需要在IclassTemplate
中指定属性的签名,强制C3
拥有从IpropTemplate
实现的属性。 (例如C1
或C2
等)
我试过了:
interface IclassTemplate
{
...
IpropTemplate prop1 { get; set; }
}
class C3 : IclassTemplate
{
...
public C1 prop1
{
get;
set;
}
}
在这种情况下,编译器会产生错误,指示C3
未实现接口成员IclassTemplate.prop1
,并且C3.prop1
无法实现IpropTemplate.prop1
,因为它没有匹配返回类型IpropTemplate
。
我该怎么办? 感谢
答案 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;}
}