Tag: 多态性

为什么这个多态的C#代码打印它所做的?

最近,我得到了下面这段代码作为帮助理解OOP – C#中的Polymorphism和Inheritance的一种难题。 // No compiling! public class A { public virtual string GetName() { return "A"; } } public class B:A { public override string GetName() { return "B"; } } public class C:B { public new string GetName() { return "C"; } } void Main() { A instance = new C(); Console.WriteLine(instance.GetName()); } […]

为什么不能在编译时解决运行时多态性?

考虑: #include<iostream> using namespace std; class Base { public: virtual void show() { cout<<" In Base \n"; } }; class Derived: public Base { public: void show() { cout<<"In Derived \n"; } }; int main(void) { Base *bp = new Derived; bp->show(); // RUN-TIME POLYMORPHISM return 0; } 为什么这段代码会导致运行时多态性,为什么不能在编译时解决呢?

多态性的好处

当我开始寻找多态的好处时,我在这里find了这个问题。 但在这里我无法find我的答案。 让我告诉我想find什么。 在这里我有一些类: class CoolingMachines{ public void startMachine(){ //No implementationion } public void stopMachine(){ //No implementationion } } class Refrigerator extends CoolingMachines{ public void startMachine(){ System.out.println("Refrigerator Starts"); } public void stopMachine(){ System.out.println("Refrigerator Stop"); } public void trip(){ System.out.println("Refrigerator Trip"); } } class AirConditioner extends CoolingMachines{ public void startMachine(){ System.out.println("AC Starts"); } public void stopMachine(){ […]

多态 – 只定义两个句子

我已经看了其他的定义和解释,没有一个能让我满意。 我想看看是否有人可以用最多两个句子来定义多态,而不需要使用任何代码或例子。 我不想听到'所以你有一个人/汽车/开jar器'或这个词是如何派生的(没有人印象深刻,你知道什么聚和变体的意思)。 如果你对多态现象有很好的把握,并且掌握了很好的英语水平,那么你应该能够用一个简短而密集的定义来回答这个问题。 如果你的定义准确地定义了多态性,但是如此密集以至于需要几次读取,那么这就是我正在寻找的东西。 为什么只有两句话? 因为一个定义是短而智能的。 解释很长,包含示例和代码。 在这里寻找解释(这些网页上的答案不满意我的问题): 多态vs覆盖vs重载 尝试尽可能简单地描述多态性 我为什么问这个问题? 因为我被问到同样的问题,我发现我无法提出一个令人满意的定义(按照我的标准,这很高)。 我想看看这个网站的任何伟大的想法是否可以做到这一点。 如果你真的不能做出这两个句子的要求(这是一个很难定义的主题),那么如果你过去了,这是很好的。 这个想法是有一个定义,实际上定义什么多态性是什么,并不解释它做什么或如何使用它(得到的差异?)。

GetType()返回从基类调用时派生最多的types吗?

GetType()返回从基类调用时派生最多的types吗? 例: public abstract class A { private Type GetInfo() { return System.Attribute.GetCustomAttributes(this.GetType()); } } public class B : A { //Fields here have some custom attributes added to them } 或者我应该只是做一个抽象的方法,派生类将不得不像以下实现? public abstract class A { protected abstract Type GetSubType(); private Type GetInfo() { return System.Attribute.GetCustomAttributes(GetSubType()); } } public class B : A { […]

避免Java中的instanceof

有一个“instanceof”操作链被认为是“代码味道”。 标准答案是“使用多态”。 在这种情况下我会怎么做? 有许多基类的子类; 没有一个在我的控制之下。 Java类Integer,Double,BigDecimal等类似的情况 if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);} else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);} else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);} 我确实可以控制NumberStuff等等。 我不想在几行代码中使用多行代码。 (有时我做一个HashMap映射Integer.class到一个IntegerStuff的实例,BigDecimal.class到一个BigDecimalStuff的实例等等。但是今天我想要更简单一些。) 我想要这样简单的事情: public static handle(Integer num) { … } public static handle(BigDecimal num) { … } 但是Java不能这样工作。 我想在格式化时使用静态方法。 我格式化的东西是复合的,其中Thing1可以包含一个Thing2s数组,Thing2可以包含Thing1s数组。 当我执行这样的格式化程序时遇到问题: class Thing1Formatter { private static Thing2Formatter thing2Formatter = new Thing2Formatter(); […]

遗传和多态性的主要区别是什么?

我今天在模块打开书考试结束时提出了这个问题,发现自己迷路了。 我正在读Head first Java和两个定义似乎是完全一样的。 我只是想知道自己心中的主要区别是什么。 我知道有一些类似的问题,但是,我没有看到哪一个提供了明确的答案。

为什么“纯多态性”比使用RTTI更可取?

几乎所有我见过的关于这种事情的C ++资源都告诉我,我应该更喜欢使用RTTI(运行时types标识)的多态方法。 总的来说,我认真对待这种build议,并试图理解其中的基本原理 – 毕竟,C ++是一个强大的野兽,它的全面深入难以理解。 然而,对于这个特定的问题,我画了一个空白,想看看互联网可以提供什么样的build议。 首先,让我总结一下我所学到的东西,列举出为什么RTTI被认为是“有害”的常见原因: 一些编译器不使用它/ RTTI并不总是启用 我真的不买这个说法。 这就像说我不应该使用C ++ 14的function,因为有编译器不支持它。 然而,没有人会阻止我使用C ++ 14的function。 大多数项目将影响他们正在使用的编译器,以及如何configuration。 甚至引用海合会的手册页: -fno-rtti 禁止生成有关虚拟函数的每个类的信息,供C ++运行时types标识特性(dynamic_cast和typeid)使用。 如果你不使用这些语言的部分,你可以使用这个标志来节省一些空间。 请注意,exception处理使用相同的信息,但G ++根据需要生成它。 dynamic_cast操作符仍然可以用于不需要运行时types信息的转换,即转换为“void *”或明确的基类。 这告诉我, 如果我不使用RTTI,我可以禁用它。 这就像说,如果你不使用Boost,你不必链接到它。 我不需要计划有人用-fno-rtti编译的情况。 另外,在这种情况下,编译器将会失败。 它需要额外的内存/可以很慢 每当我试图使用RTTI,这意味着我需要访问我的类的某种types的信息或特点。 如果我实现一个不使用RTTI的解决scheme,这通常意味着我将不得不添加一些字段到我的类来存储这些信息,所以内存参数是无效的(我将举一个更进一步的例子)。 dynamic_cast的确可以很慢。 不过,通常有避免使用速度危机的方法。 我不太明白这个select。 这个答案build议使用在基类中定义的枚举来存储types。 只有当你知道你所有的派生类时,这才有效。 这是一个相当大的“如果”! 从这个答案看来,RTTI的成本似乎也不明确。 不同的人测量不同的东西。 优雅的多态devise将使RTTI不必要 这是我认真对待的那种build议。 在这种情况下,我根本无法提出涵盖我的RTTI用例的好的非RTTI解决scheme。 让我举个例子: 假设我正在编写一个库来处理某些对象的graphics。 我想让用户在使用我的库时生成自己的types(所以枚举方法不可用)。 我有我的节点的基类: class node_base { public: node_base(); […]

在Java中,如何从派生类中的重写方法调用基类的方法?

我有两个Java类:B,它扩展了另一个类A,如下所示: class A { public void myMethod() { /* … */ } } class B extends A { public void myMethod() { /* Another code */ } } 我想从B.myMethod()中调用A.myMethod()。 我来自C ++的世界 ,我不知道如何在Java中做这个基本的事情:(如果有人可以帮助:)谢谢。

为什么'ref'和'out'支持多态?

采取以下措施: class A {} class B : A {} class C { C() { var b = new B(); Foo(b); Foo2(ref b); // <= compile-time error: // "The 'ref' argument doesn't match the parameter type" } void Foo(A a) {} void Foo2(ref A a) {} } 为什么会发生上述编译时错误? 这与ref和out参数一起发生。