![](/img/trans.png)
[英]Inherit Class1 and implement Interface1 both in case Class1 already implements Interface1
[英]Defining a property of type 'class1 : interface1' into another interface
我有一些实现接口的类,如下所示:
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
。
我该怎么办? 谢谢
你不能让你的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.