Questions tagged «polymorphism»

6
是什么使Haskell类型系统如此受人尊敬(相对于Java)?
我开始学习Haskell。我对此很陌生,我只是在阅读一些在线书籍,以了解其基本结构。 熟悉它的人经常谈论的“模因”之一就是整个“如果它可以编译,它将可以工作*”的东西-我认为这与类型系统的强度有关。 我试图理解为什么Haskell在这方面到底比其他静态类型的语言要好。 换句话说,我假设在Java中,您可以做一些令人讨厌的ArrayList<String>()事情,例如埋葬, 以包含确实应该包含的内容ArrayList<Animal>()。这里令人讨厌的事情是您的stringcontains elephant, giraffe等,如果有人放进去,Mercedes您的编译器将无法为您提供帮助。 如果这样做了,ArrayList<Animal>()那么在以后的某个时间点,如果我确定我的程序不是真正的关于动物的,而是关于车辆的,那么我可以更改,例如产生ArrayList<Animal>生产的功能,ArrayList<Vehicle>而我的IDE应该告诉我那里的所有地方是一个编译中断。 我的假设是,这就是人们所说的强类型系统的含义,但是对我而言,为什么Haskell的更好才是显而易见的。换句话说,您可以编写好的Java或坏的Java,我假设您可以在Haskell中执行相同的操作(即,将东西填入字符串/整数中,它们实际上应该是一流的数据类型)。 我怀疑我缺少重要/基本的东西。 我很高兴能向我展示我的方式的错误!

17
OO编程真的和招聘公司一样重要吗?[关闭]
我正在完成我的硕士学位(计算机)并申请工作。我注意到许多公司专门要求了解面向对象。流行的访谈问题涉及继承,多态性,访问器等。 OO真的那么重要吗?我什至接受了C语言编程工作的面试,面试的一半是面向对象的。 在现实世界中,开发实际应用程序时,几乎总是使用面向对象吗?诸如多态性之类的关键功能是否大量使用? 我认为我的问题来自我的弱点之一。尽管我了解OO,但是似乎无法将其大量集成到我的程序中。

12
方法重载除了语法糖之外吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 方法重载是一种多态吗?对我来说,似乎只是名称相同和参数不同的方法的区别。因此stuff(Thing t),stuff(Thing t, int n)就编译器和运行时而言,它们是完全不同的方法。 它在调用方方面产生了一种幻觉,即对相同类型的对象(即多态)的作用不同。但这只是一种幻想,因为实际上stuff(Thing t)和stuff(Thing t, int n)完全不同。 方法重载除了语法糖之外吗?我想念什么吗? 语法糖的一个常见定义是它纯粹是局部的。意思是将一段代码更改为“加糖的”等效代码,反之亦然,这涉及不影响程序整体结构的局部更改。而且我认为方法重载完全符合此标准。让我们看一个示例来演示: 考虑一个类: class Reader { public String read(Book b){ // .. translate the book to text } public String read(File b){ // .. translate the file to text } } 现在考虑使用该类的另一个类: /* might not be the …

9
多态性在现实世界中如何使用?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 去年关闭。 我试图了解在现实生活中的项目中如何使用多态,但是我只能找到经典的示例(或类似的例子),该示例具有一个Animal带方法的父类speak(),以及许多重写此方法的子类,现在您可以speak()在任何子对象上调用该方法,例如: Animal animal; animal = dog; animal.speak(); animal = cat; animal.speak();

4
Java-使用多态或有界类型参数
假设我有这个类层次结构... public abstract class Animal { public abstract void eat(); public abstract void talk(); } class Dog extends Animal { @Override public void eat() { } @Override public void talk() { } } class Cat extends Animal { @Override public void eat() { } @Override public void talk() { } …

6
鸭子是否正在输入多态性的子集
从WIkipedia上的多态 在计算机科学中,多态是一种编程语言功能,它允许使用统一的界面来处理不同数据类型的值。 从维基百科上的鸭子打字 在使用面向对象的编程语言进行的计算机编程中,鸭子类型是一种动态类型的类型,其中对象的当前方法和属性集确定有效的语义,而不是其从特定类或特定接口的实现继承。 我的解释是,基于鸭子的类型,对象的方法/属性确定了有效的语义。这意味着对象的当前形状决定了它所坚持的界面。 从多态性可以说,如果一个函数接受多种不同的数据类型,只要它们支持一个接口,则该函数就是多态的。 因此,如果一个函数可以忽略类型,则它可以接受多种不同的数据类型并对其进行操作,只要这些数据类型具有正确的方法/属性并因此维护接口即可。 (术语“接口”的使用不是作为代码结构,而是作为描述性的文档结构)。 鸭型与多态性的正确关系是什么? 如果一种语言可以鸭式输入,是否意味着它可以做到多态?

6
如何为多态类创建GUI?
假设我有一个测试构建器,以便老师可以为测试创建很多问题。 但是,并非所有问题都相同:您有多项选择,文本框,匹配项等等。这些问题类型中的每一个都需要存储不同类型的数据,并且对于创建者和应试者都需要不同的GUI。 我想避免两件事: 类型检查或类型转换 我的数据代码中与GUI有关的所有内容。 在最初的尝试中,我最终获得了以下课程: class Test{ List<Question> questions; } interface Question { } class MultipleChoice implements Question {} class TextBox implements Question {} 但是,当我去显示测试时,我不可避免地会得到如下代码: for (Question question: questions){ if (question instanceof MultipleChoice){ display.add(new MultipleChoiceViewer()); } //etc } 这感觉像是一个非常普遍的问题。是否有一些设计模式可以让我在避免上面列出的项目的同时提出多态性问题?还是多态性首先是错误的想法?

3
什么是上行/下行?
学习多态性时,您通常会看到类似这样的信息 class Base { int prv_member; virtual void fn(){} } class Derived : Base { int more_data; virtual void fn(){} } 什么是上流或下流?是(Derived*)base_ptr;上流还是下流? 我之所以称其为“沮丧”,是因为您正在远离基础而进入更具体的领域。其他人告诉我,这很沮丧,因为您将层次结构分解为特定的东西,而顶部是根。但是其他人似乎把它叫做我所说的。 在将基本PTR转换为派生PTR时,它称为上播还是下播?以及是否有人可以链接到官方消息来源或解释其为何如此之称比什么都伟大。

4
在多态性的背景下,如何处理为子类型添加的方法?
当使用多态性的概念时,您将创建一个类层次结构,并使用父代引用来调用接口函数,而无需知道对象具有哪种特定类型。这很棒。例: 您有动物的集合,并且可以调用所有动物的功能,eat而不必关心它是吃狗还是猫。但是在同一个类层次结构中,您的动物除了从类继承和实现Animal(例如makeEggs,getBackFromTheFreezedState等等)外,还具有其他动物。因此,在某些情况下,您可能需要了解调用其他行为的特定类型。 例如,如果是早晨,如果它只是一只动物,那么您可以致电eat;否则,如果是人类,那么请首先致电washHands,getDressed然后再致电eat。如何处理这种情况?多态性死亡。您需要找出对象的类型,这听起来像是代码气味。是否有处理这种情况的通用方法?

4
手动进行依赖注入是否可以更好地替代组成和多态性?
首先,我是入门级程序员;实际上,我正在整个夏季完成AS学位,并完成了最终的顶峰项目。在我的新工作中,当我没有什么项目要做(他们正在等待团队中有更多新员工的到来)时,我在等待的过程中会得到一些可供阅读和学习的书籍-一些教科书,其他与其说是“代码完成”,不如说是。看完这些书之后,我转向互联网学习尽可能多的知识,并开始学习SOLID和DI(我们谈论了Liskov的替代原理,但没有其他SOLID想法)。因此,据我所知,我坐下来做得更好,并且开始编写一些代码以手工使用DI(开发计算机上没有DI框架)。 正如我所做的那样,我发现它感觉很熟悉……而且似乎很像我过去使用多态抽象类的组合所做的工作。我在这里想念大图吗?关于DI(至少是手工),还有其他一些东西吗?我了解在某些DI框架的代码中不包含配置的可能性,这些优点在无需重新编译的情况下就具有很大的好处,但是在手工操作时,我不确定它是否与上述内容有所不同...对此有一些了解将非常有帮助!

2
通过将期望超类型的子类对象作为参数传递来覆盖方法
我只是在学习Java,而不是一名实践的程序员。 我要遵循的书说,重写方法时,参数类型必须相同,但是返回类型可以是多态兼容的。 我的问题是为什么传递给重写方法的参数不能不是预期的超类型的子类类型? 在重载方法中,可以保证在对象上定义了我对对象调用的任何方法。 有关建议的重复项的注意事项: 第一个建议似乎是关于类层次结构以及在何处放置功能。我的问题更集中于为什么存在语言限制。 在第二个建议,说明如何做我问什么,而不是为什么它做的方式。我的问题集中在为什么。

4
处理模型和视图时切换与多态
我想不出更好的解决方案。我有一个显示元素列表的视图控制器。这些元素是可以作为B,C,D等的实例并从A继承的模型。因此,在该视图控制器中,每个项目都应转到应用程序的不同屏幕,并在用户选择其中的一个时传递一些数据。 。我想到的两个选择是(请忽略语法,它不是特定的语言) 1)开关(我知道那很烂) //inside the view controller void onClickItem(int index) { A a = items.get(index); switch(a.type) { case b: B b = (B)a; go to screen X; x.v1 = b.v1; // fill X with b data x.v2 = b.v2; case c: go to screen Y; etc... } } 2)多态 //inside …

6
OO设计,如何为音调和声建模?
我已经开始用C ++ 11编写一个程序来分析和弦,音阶和和声。我在设计阶段遇到的最大问题是,音符“ C”是音符,和弦类型(Cmaj,Cmin,C7等)和键类型(Cmajor,Cminor的键)。间隔也会出现相同的问题(小三,大三)。 我使用的是基类Token,它是程序中所有“符号”的基类。因此,例如: class Token { public: typedef shared_ptr<Token> pointer_type; Token() {} virtual ~Token() {} }; class Command : public Token { public: Command() {} pointer_type execute(); } class Note : public Token; class Triad : public Token; class MajorTriad : public Triad; // CMajorTriad, etc class Key …

3
在不总是检查属性和方法的情况下,如何在JavaScript中使用鸭子输入?
我知道javascript使用鸭子类型,而且起初我认为与强类型语言(如C#)相比,这会使多态性变得容易。但是现在,我带有参数的函数充满了诸如此类的东西: if(myObj.hasSomeProperty()) 要么 if(myObj.hasSomeMethod()) 要么 if(isNumber(myParam)) 等等 这对我来说真的很丑。我来自C#背景,发现定义的接口要好得多。 我想知道我是否错误地尝试应用在静态类型的语言中有效的策略,并且在javascript中有更好的方法呢? 我知道我无法检查,但是跟踪javascript运行时错误可能是一场噩梦,因为它们并非总是在代码中实际发生错误的地方发生。

5
编写可测试代码与避免投机性
我今天早上在看一些博客文章,偶然发现了这一篇: 如果唯一实现Customer接口的类是CustomerImpl,那么您实际上就没有多态性和可替代性,因为实际上在运行时没有什么可以替代。这是假的普遍性。 这对我来说很有意义,因为实现接口会增加复杂性,而且,如果只有一种实现,则可能会争辩说它会增加不必要的复杂性。编写比需要的抽象要抽象得多的代码通常被认为是被称为“投机性一般性”的代码气味(在文章中也提到了)。 但是,如果我遵循TDD,那么如果没有这种推测性的普遍性(无论是接口实现形式还是我们的其他多态选项),就无法(轻松)创建测试双打,从而使类可继承且其方法是虚拟的。 那么,我们如何协调这种权衡呢?以投机性方式推广测试/ TDD是否值得?如果您使用的是测试双打,是否将这些视为第二种实现方式,从而使普遍性不再具有推测性?您是否应该考虑一个更重的模拟框架,该框架可以模拟具体的协作者(例如,C#世界中的Moles与Moq)?或者,您应该使用具体的类进行测试,并编写什么可以被视为“集成”测试,直到您的设计自然需要多态性之前? 我很想阅读其他人对此事的看法-预先感谢您的意见。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.