soc*_*soc 5 language-agnostic inheritance types contravariance
从理论上讲,使用一种方法覆盖子类中父类的方法是合理的,其中参数是父类中参数的超类型,如:
class T
def foo(s: String) = ...
class S
override def foo(a: Any) = ...
Run Code Online (Sandbox Code Playgroud)
哪种编程语言支持这个"特性",以及它们如何解决诸如子类的单个方法可以覆盖父类的多个方法的问题:
class T
def foo(s: String) = ...
def foo(i: Int) = ...
class S
override def foo(a: Any) = ...
Run Code Online (Sandbox Code Playgroud)
(假设String
和.的Int
子类型Any
.)
虽然我掌握了这些概念,但我不知道我是否完全理解你的问题。也就是说,听起来您是在说派生类应该能够实现使用“较少”派生的参数的方法的重写。这对我来说似乎是倒退的。似乎重写方法应该只能使用“更多”派生类型。也许这就是您的意思,或者也许我弄错了,但这里引用了 C# 4.0 允许的内容:
(摘自http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx)
泛型类型参数的方差是什么?这是 C# 4.0 中的新功能。现在,在创建泛型接口时,您可以指定具有不同类型参数的接口实例之间是否存在隐式转换。例如,您可以使用一个接口实例,该接口实例的方法的派生返回类型多于最初指定的类型(协方差),或者其方法的派生参数类型较少(逆变)。相同的规则适用于通用代表。