c# - C# 中的多态性是否如此多态?

标签 c# functional-programming polymorphism lambda

我想知道,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/

相关文章:

c# - IBM Websphere MQ 客户端使用 SSL 连接远程队列

c# - Xamarin Android 网格控件

haskell - 函数式编程语言中的自动内存

haskell - 如何使用 map 制作部分应用功能的列表?

c# - 列表的多态性

C#/通过foreach访问时访问列表中子类的方法

java - 类和具体类

c# - WPF 径向进度条/仪表(即电池表)

functional-programming - 学习函数式编程的一个好的用例是什么?

c# - 在 C# 中检测(通过反射)枚举是否为 "Flags"类型的策略