Tag: 多态性

在C ++ 11中声明接口的最佳方法

众所周知,一些语言有接口的概念。 这是Java: public interface Testable { void test(); } 我怎样才能以最紧凑的方式在C ++(或C ++ 11)中实现这一点,而且代码噪声很小? 我将不胜感激一个解决scheme,不需要一个单独的定义(让头是足够的)。 这是一个非常简单的方法,即使我find越野车;-) class Testable { public: virtual void test() = 0; protected: Testable(); Testable(const Testable& that); Testable& operator= (const Testable& that); virtual ~Testable(); } 这只是一个开始,而且已经更长了,我想要的。 如何改善? 也许在这个std命名空间的某个地方有一个基类呢?

什么是Javascript中的多态性?

我已经阅读了一些我可以在互联网上find的关于多态性的文章 。 但是我觉得我不太明白它的意思和它的重要性。 大多数文章没有说明为什么它是重要的,我怎么能在OOP中实现多态行为(当然在JavaScript中)。 我不能提供任何代码示例,因为我还没有想法如何实现它,所以我的问题如下: 它是什么? 为什么我们需要它? 怎么运行的? 我怎么能在JavaScript中实现这种多态行为? 我有这个例子。 但是这个代码的结果是容易理解的。 它没有给出关于多态性本身的清晰的概念。 function Person(age, weight) { this.age = age; this.weight = weight; this.getInfo = function() { return "I am " + this.age + " years old " + "and weighs " + this.weight +" kilo."; } } function Employee(age, weight, salary) { this.salary = salary; […]

多态可能没有inheritance?

在一次采访中,我被问到是否可以在没有inheritance的情况下实现多态。 这可能吗?

什么是单态限制?

我很困惑haskell编译器如何推断比我所期望的多态性更less的types,例如,当使用无点定义时。 看起来问题是“单态限制”,在编译器的旧版本上默认是这样的。 考虑下面的haskell程序: {-# LANGUAGE MonomorphismRestriction #-} import Data.List(sortBy) plus = (+) plus' x = (+ x) sort = sortBy compare main = do print $ plus' 1.0 2.0 print $ plus 1.0 2.0 print $ sort [3, 1, 2] 如果我用ghc编译这个,我没有得到erros,可执行文件的输出是: 3.0 3.0 [1,2,3] 如果我将main更改为: main = do print $ plus' 1.0 2.0 print $ […]

多态性的实例

任何人都可以请给我一个真实的生活,多态的实际例子? 我的教授告诉我,我总是听到关于+运营商的那个老故事。 a+b = c和2+2 = 4 ,所以这是多态性。 我真的不能把自己与这样一个定义联系起来,因为我已经在许多书中阅读和重读了这个定义。 我需要的是一个真实世界的代码示例,我可以真正联想到的东西。 例如,这里是一个小例子,以防万一你想扩展它。 >>> class Person(object): def __init__(self, name): self.name = name >>> class Student(Person): def __init__(self, name, age): super(Student, self).__init__(name) self.age = age

python属性和inheritance

我有一个基类,我想在子类中覆盖(get方法)的属性。 我的第一个想法是这样的: class Foo(object): def _get_age(self): return 11 age = property(_get_age) class Bar(Foo): def _get_age(self): return 44 这是行不通的(子类bar.age返回11)。 我find了一个lambdaexpression式的解决scheme: age = property(lambda self: self._get_age()) 那么这是使用属性并将其覆盖在子类中的正确解决scheme,还是有其他更好的方法来做到这一点?

无编程(基本上没有条件)

我有一位同事告诉我,他曾经为一家公司做过工作,他们没有在代码中使用条件语句(“if”和“switch”语句),他们让代码中的所有决定都使用多态性和(我猜)一些其他的OO原则。 我有点理解这个背后的原因,让代码更干,更容易更新,但我正在寻找这个概念的更深入的解释。 或者,也许这是更一般的devise方法的一部分。 如果有人有这方面的资源,或者愿意解释,甚至有更多的相关条款,我可以用来find更多的答案,我会非常感激。 我在SO上发现了一个相关的问题,但是我对C ++不熟悉,所以我不太了解那里的答案。 (我不是OO大师顺便说一句,但我可以pipe理) 我是最擅长的PHP,之后Python,所以我更喜欢使用这些语言的信息。 更新:我会问我的同事更多的信息,他是什么意思。 更新2015年:经过多年的编程经验,我现在看到,这个政策的目的可能是防止程序员通过在某些地方添加条件语句(如果语句)以偶然的方式添加function。 扩展软件的一个更好的方法是使用软件通过inheritance和多态扩展的“打开/closures原则” 。 我强烈怀疑这个政策是否在所有条件下都是超严格的,因为如果没有这个政策,就很难完全走下去。

我可以重写在C#中的属性? 怎么样?

我有这个基类: abstract class Base { public int x { get { throw new NotImplementedException(); } } } 和下面的后裔: class Derived : Base { public int x { get { //Actual Implementaion } } } 当我编译时,我得到这个警告说派生类的x的定义将隐藏它的基本版本。 是可以覆盖C#类似的方法的属性?

重新提出exceptiontypes和消息,保留现有信息

我正在编写一个模块,并希望为它可以引发的exception(例如从所有foo模块的特定exception的FooError抽象类inheritance)有一个统一的exception层次结构。 这允许模块的用户捕获这些特定的exception,并在需要时明确处理它们。 但是由于某些其他的例外情况,模块中引发的许多例外情况都会引发。 例如由于文件上的OSError而导致某些任务失败。 我需要的是“包装”捕获到的exception,使其具有不同的types和消息 ,以便通过捕获exception来获取信息。 但我不想丢失现有的types,消息和堆栈跟踪; 对于试图debugging问题的人来说,这是所有有用的信息。 顶级的exception处理程序是不好的,因为我试图装饰exception,然后再传播到堆栈的顶层,而顶层的处理程序太迟了。 这部分通过从现有types(例如class FooPermissionError(OSError, FooError) )中派生我的模块foo的特定exceptiontypes来解决,但是这并不能使以新types包装现有exception实例变得更容易,修改消息。 Python的PEP 3134 “exception链接和embedded式跟踪”讨论了Python 3.0中为“链接”exception对象所接受的更改,以指示在处理现有exception期间引发了新的exception。 我想要做的是相关的:我需要它在早期的Python版本中工作,我不需要链接,而只是为了多态。 什么是正确的方法来做到这一点?

为什么Haskell的`head`会在空列表中崩溃(或者为什么*不会返回一个空列表)? (语言哲学)

请注意其他潜在的贡献者:请不要犹豫,使用抽象或math符号来expression您的观点。 如果我发现你的答案不清楚,我会请求澄清,但是可以随意以舒适的方式expression自己。 要清楚的是:我不是在寻找一个“安全的” head ,也不是特别有意义的head的select。 问题的实质是关于head和head'的讨论,这些提供了背景。 我已经跟Haskell打了几个月了(到了它已经成为我的主要语言的地步了),但是我承认对于一些更高级的概念和语言的哲学的细节并不是很了解我非常乐意学习)。 那么我的问题就不是技术问题了(除非是这个问题,我只是没有意识到),因为这是一个哲学问题。 对于这个例子,我是说head 。 我想你会知道, Prelude> head [] *** Exception: Prelude.head: empty list 这head :: [a] -> a 。 很公平。 显然,不能返回(挥手)没有types的元素。 但同时,定义也很简单(如果不是微不足道的话) head' :: [a] -> Maybe a head' [] = Nothing head' (x:xs) = Just x 在某些陈述的评论部分,我已经看到了这方面的一些小讨论。 值得注意的是,一个Alex Stangl说 “有充分的理由不要让一切”安全“,并在违反先决条件时抛出exception。 我不一定质疑这个说法,但我很好奇这些“好理由”是什么。 另外,保罗·约翰逊说, '例如,你可以定义“safeHead :: [a] – >也许是一个”,但是现在不是处理一个空列表或者certificate它不能发生,你必须处理“Nothing”或者certificate它不能发生“。 我从这个评论中读出的语气表明,这在困难/复杂性/某事方面显着增加,但我不确定我是否掌握了他在那里展示的内容。 […]