我想知道,C# 是如何实现多态的?
如果我们基于这个词的定义:多态性 ( ...在面向对象编程的上下文中,多态性是创建变量、函数或具有多种形式的对象...),当然我可以提供更多关于多态性的确定,但我认为平均而言,我们所有人都理解什么是计算机科学中的多态性。
所以,关于我的问题,我与 C# 相关。
例如,我使用的是非常简单明了的示例,这是一个类 A
中的标准虚方法和另一个类 B
中的重写方法:
using System;
class A
{
public virtual void CallMe(string incString)
{
Console.WriteLine(incString);
}
}
class B : A
{
public override void CallMe(string incString)
{
incString += "_new";
Console.WriteLine(incString);
}
}
class App
{
static void Main()
{
B objectB = new B();
objectB.CallMe("hello");
}
}
首先,我很沮丧:为什么 C# 现在允许使用覆盖方法的返回类型和参数?
例如,只是为了设置:
public override int CallMe(string incString)
但是你不会得到很好的结果,你会捕获一个编译器异常:
B.CallMe(string)': return type must be `void' to match overridden member
对于我所描述的情况,如果我想定义一个具有相似名称但返回不同的方法,我们只能在 C# 中通过使用关键字 new
隐藏方法来解决它类型/参数列表。我想承认,如果我们隐藏它,它根本就不是多态性,它只是一个隐藏过程。定义中的多态性需要覆盖现有的东西(类似的过程可以在化学、数学等其他科学科学中找到......)
例如数学允许使用第 2、第 3...N-arny 顺序的多态性,其中现有的集合或对象总是可以重新定义。但是计算机科学和 C# 到底是什么?
我读过,但没有尝试,某些函数式编程语言(LISP、Haskell)确实允许此类功能。
将来是否有可能在 C# 中看到,因为正如我所看到的,C# 的每个新版本都在增加它的功能性内容,而且越来越多,也许 lambdas/delegates 会成为可能?
你怎么看?
最佳答案
面向对象编程中多态性的要点是,您可以拥有不同的类,其方法执行不同的操作,但您可以以相同的方式调用它们。因此,覆盖是使用完全相同的方法签名完成的,因为如果您要更改签名,则无法以相同的方式使用这些方法。
由于方法签名保持不变,您可以拥有使用对基类(或接口(interface))的引用的代码,以及可以是实现该类型的任何类的实际实例。代码可以进行相同的调用而无需关心实际类型是什么。
例子:
A obj;
if (new Random().Next(2) == 0) {
obj = new A();
} else {
obj = new B();
}
obj.CallMe("hello");
关于c# - C# 中的多态性是否如此多态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295223/