定义类型为'class1: interface1'转到另一个接口
本文关键字:接口 另一个 interface1 class1 类型 定义 | 更新日期: 2023-09-27 18:08:03
我有一些实现如下接口的类:
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
匹配的返回类型而不能实现IpropTemplate.prop1
。
我该怎么办?由于
您不能让您的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;}
}