|
1
|
| itarato Randy Sugianto 'Yuku' · 技术社区 · 16 年前 |
|
|
1
1
|
|
|
2
1
一旦您忘记了对象的真实类型,将其作为超级类型之一传递,就没有安全的方法将其取回,因为:
但是
因此,从逻辑上讲,您不能从超级类型实例返回到子类型实例—至少在没有任何安全保证的情况下是这样。 解决这个问题的唯一方法是在需要执行子类型操作时记住子类型。如果您的语言支持协变返回类型,则可以使用协变返回类型来改进接口定义,这样子类型就不会不必要地丢失:
这样,在树节点上调用getParent()时,得到的是树节点,而不是ITree。当然,如果在声明为ITree的同一个实例上调用getParent(),则返回ITree。一旦忘记了类型信息,就太晚了。 在一个类中,你可以选择处理实类型,你仍然可以在接口中与外界对话(故意丢失超类型信息),但是实现可以处理实类型而不是接口。 我在用Java做一些代码的实验。如果你感兴趣,这里是:
|
|
|
3
1
实现ICustomTreeNode的 )然后创建一个新的ITree子接口:
这样我就可以使用正确类型的对象。 |
|
EarthTurtle · 调整泛型抛出迭代器的异常类型 2 年前 |
|
wallop · 实现必须明确提及所有接口字段,还是可以跳过它们? 2 年前 |
|
|
Reelie · C#11-通过抽象类在接口中静态抽象成员? 2 年前 |
|
Addem · 在OCaml签名中放入类型声明的正确方法是什么 2 年前 |