是什么多态性与鸭子类型之间的区别?(What is the difference between p

2019-06-26 07:16发布

我用两个词有点糊涂,这是我知道的:

多态性是不同类型的对象的由一个共同的接口被处理的能力。 虽然鸭打字,是一种动态类型的,它允许不同类型的对象,以同样的方法作出回应。

据我了解,多态性更多的是创建可以在不同的类中共享的接口。 鸭打字是关于弱类型,这将使​​方法,只要它是在消息的接收者发现调用。

它是否正确? 我在两个很困惑,他们似乎相关,但我不知道他们的关系是什么。 非常感谢提前!

Answer 1:

多态性 (在面向对象编程的范畴内)是指一个子类可以覆盖基类的方法。 这意味着一个类的方法可以在子类中做不同的事情。 例如:一类Animal可以有一个方法talk()和子类DogCatAnimal可以让方法talk()发出不同的声音。

鸭打字装置的代码将简单地接受具有特定方法的任何对象。 比方说,我们有以下代码: animal.quack() 如果给定对象animal有我们要调用的方法,然后我们是很好的(无需额外的类型要求)。 这不要紧,无论animal实际上是Duck或不同的动物这也恰好嘎嘎。 这就是为什么它被称为鸭打字:如果它看起来像一只鸭子(例如,它有一个方法叫quack()那么我们就可以就好像该对象是鸭子行动)。

因此,在这些有关系吗? 它们是一种编程语言可能只是独立的功能。 存在具有多态性,但没有鸭子类型(如Java)的编程语言。 还有一些具有多态性与鸭子类型(比如Python)的语言。



Answer 2:

这是多态性在Python的例子。

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Cat('Mr. Mistoffelees'),
           Dog('Lassie')]

for animal in animals:
    print animal
    print animal.name + ': ' + animal.talk()

这是在Python鸭打字的例子。

class Duck:
    def quack(self):
        print("Quaaaaaack!")
    def feathers(self):
        print("The duck has white and gray feathers.")
    def name(self):
        print("ITS A DUCK NO NAME")


class Person:
    def quack(self):
        print("The person imitates a duck.")
    def feathers(self):
        print("The person takes a feather from the ground and shows it.")
    def name(self):
        print("John Smith")

def in_the_forest(duck):
    duck.quack()
    duck.feathers()
    duck.name()

def game():
    for element in [ Duck() , Person()]:
        in_the_forest(element)

game()
  • 在多态,我们看到的子类( CatDog )从父类(继承Animal ),并覆盖方法谈。
  • 在鸭打字的情况下,我们不创建一个子类,而不是新的类与具有相同名称但不同的函数方法创建的。


Answer 3:

两型多态性

  1. 方法重载(编译时多态)。
  2. 方法重载(运行时多态性)。

方法重载: - 相同的函数名和不同的数据类型被称为方法重载

例如:

  int addTwovalues(int a, int b)
  { return (a+b)}

  float addTwovalues(float a, float b)
  { return (a+b)}

  Method overriding :- same function name and same data type but different Class
     is known as       Method overriding.


  class a
 {
  virtual int addtwovalues()
   {  // to do  }
  }
 class b:a
 {
     override int addtwovalues()
   {  // to do  }

  }



  a obj=new a();
  obj.addtwovalues();

  b objb=new a();
  objb.addtwovalues();  //run time Polymorphism 


Answer 4:

答案很简单:

鸭打字是实现多态性的一种方式。 另一种方法是使用静态类型。

长一点的回答:

这里涉及到两个不同的概念,类型和编程技术。

鸭打字是一种类型的打字。 和打字是指抛出错误时通过周围的对象不被期望的。 鸭打字是一种打字的地方,它抛出错误时的程序正在运行,正在调用的方法不可用。 静态类型自带的编译时间检查,所以如果该类型信息不匹配,它会在您编译代码抛出错误。 这就是打字。

多态是一种编程技术,您可以允许多种类型的对象履行一定的责任。 您可以通过使用基本类型来表示所有子类类型做到这一点。 您可以使用鸭子类型来表示所有有需要的方法的不同类型。 您可以使用一个接口来代表所有实现该接口的类型。

有回答说多态性是继承,这是不正确的。 虽然你可以使用继承创建多态行为,通常这是你做了什么,但是这并不是是关于什么的多态性。

首先,你不需要继承如上所述具有多态性。

其次,术语“多态性”是依赖于抽象,而不是实现代码的客户端代码的背景下更有意义。 仅仅因为你有一个超类,并从它继承并重写一些方法,并不意味着这是多态的几个其他类,创建多态,你必须编写客户端代码中多态的方式来消耗这些类。



文章来源: What is the difference between polymorphism and duck typing?