C#接口继承(基础知识)

时间:2010-03-12 12:50:25

标签: c# inheritance .net-2.0

为什么以下产生编译器错误:

public interface OwnSession : ISession { }

[...]
OwnSession s = SessionFactory.OpenSession(); // compiler error (in german unfortunately)
[...]

“SessionFactory”在“OpenSession()”(NHibernate)上返回“ISession”

4 个答案:

答案 0 :(得分:10)

你应该投射结果:

OwnSession s = (OwnSession) SessionFactory.OpenSession();

如果OpenSession()返回一个ISession类型,它可能是任何实现ISession的东西,所以你必须告诉编译器你期望一个 OwnSession 类型(只有你确定它会返回它的类型)当然)

另一方面,您可以将变量声明为ISession,并继续使用它。除非您想使用 OwnSession 类型中的方法或属性,这些方法或属性在ISession接口规范中不可用。

答案 1 :(得分:5)

返回的对象只是“ISession”,它不是“OwnSession”(顺便说一句,你应该在它前面添加I:IOwnSession)。想象一下,你有一个函数返回一个汉堡,你不能把它作为一个cheesburger,因为它可能不是一个......

答案 2 :(得分:1)

我猜是因为OwnSession可能比ISession更大/更不同?

想象一下,如果OwnSession继承自ISession但又添加了另一个方法签名..那么SessionFactory.OpenSession方法返回的ISession将与OwnSession定义的契约相匹配(或者它可以但不一定取决于实际的具体类型返回...编译器不知道那个)

答案 3 :(得分:0)

SessionFactory.OpenSession调用将返回一个实现ISession接口的对象,但您的OwnInterface更具体。施法可能是其中一种方法,或直接与ISession合作......