使用switch语句的多态性

Fai*_*ist 0 c# polymorphism inheritance switch-statement

我们有一些文档类型:

class Document
{
    public void virtual Print()
}

class PDF : Document
{
    public void override Print()
    {
        Console.WriteLine("PDF Printed");
    }
}

class Excel : Document
{
    public void override Print()
    {
        Console.WriteLine("Excel Printed");
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我们有一个文档列表(Document对象),我们在所有文档上调用虚函数Print().

foreach(Document doc in DocumentsList)
{
    doc.Print();
}
Run Code Online (Sandbox Code Playgroud)

我知道多态性是实现它的非常复杂的方法,但我们是否真的可以使用switch语句来做同样的事情?我与一位同事就此进行了长时间的争论,他说这是可能的.是吗?

小智 5

是的,你可以,当然你可以在每次迭代中询问列表的成员,并且有很多技术可以实现这一点(例如属性,内部类型字段等).

事实上,你在C#中所做的一切,你也可以在汇编程序中做! 但是,我几乎看不到避免OOP优势的任何好处.


Pet*_*ica 5

是的,您始终可以使用开关(或 if-else 链)来询问类型。您可以将文档类型信息保存在对象中(例如作为枚举),并在开关中使用它。

为什么你不应该这样做?因为当您添加新的派生类型时,您必须扩展所有这些开关。

为了避免这种情况,您可以实现更自动化的功能:拥有一个指向函数(或 C# 中的委托)的指针列表,您可以使用适合该特定对象的函数为每个单个对象填充该列表(例如,委托将print指向print_pdf()PDF文件和print_excel()excel 文件)。嘿,你已经手工制作了一个穷人的多态性。

多态性的好处是使用多态对象的代码可以是类型无关的。它不知道该对象实际具有什么精确类型,也不想知道。当编写处理对象的代码时,精确的类型可能还不存在。所有详细信息都隐藏在类型中, 这对于维护来说非常有用。