我有一个简单的c#问题(所以我相信)。我是这个语言的初学者,我遇到了关于实现它们的接口和类的问题。问题是
我有界面iA
interface iA
{
bool method1
bool method2
bool method3
}
和3个实现接口的类:class B
,C
和D
class B : iA
{
public bool method1
public bool method2
public bool method3
}
如果B类有另一个不在界面中的方法,那就说method4()
我有以下内容:
iA element = new B();
然后我会用:
element.method4();
我会收到一条错误消息,说我没有method4()
接受类型为iA
的第一个参数。
问题是:我是否可以拥有接口类型的对象并使用类进行实例化,并让该对象从类中调用一个方法,该方法不在接口中?
我提出的解决方案是在接口和派生类之间使用抽象类,但是IMO会使接口超出范围。在我的设计中,我想只使用接口和派生类。
答案 0 :(得分:4)
是的,这是可能的。您只需要将Interface类型转换为类类型:
iA element = new B();
((B)element).method4();
根据wudzik的建议,你应该检查elemnt是否属于正确的类型:
if(element is B)
{
((B)element).method4();
}
答案 1 :(得分:2)
没有施法,你可以做到这一点。
interface iA
{
bool method1();
bool method2();
bool method3();
}
interface IFoo : iA
{
bool method4();
}
class B : IFoo
{
public bool method1() {}
public bool method2() {}
public bool method3() {}
public bool method4() {}
}
IFoo element = new B();
element.method4();
注意:尝试为C#接口使用大写I
前缀。
答案 2 :(得分:2)
您必须将接口类型强制转换为类类型;通常我们通过 as :
来实现 B b = element as B; // <- try cast element as B
if (!Object.RefernceEquals(null, b)) { // <- element is B or can be legaly interpreted as B
b.method4();
}
“as”的优点是只有一个强制转换操作,而“是”和(B)必须进行两个强制转换。