我用两个词有点糊涂,这是我知道的:
多态性是不同类型的对象的由一个共同的接口被处理的能力。 虽然鸭打字,是一种动态类型的,它允许不同类型的对象,以同样的方法作出回应。
据我了解,多态性更多的是创建可以在不同的类中共享的接口。 鸭打字是关于弱类型,这将使方法,只要它是在消息的接收者发现调用。
它是否正确? 我在两个很困惑,他们似乎相关,但我不知道他们的关系是什么。 非常感谢提前!
我用两个词有点糊涂,这是我知道的:
多态性是不同类型的对象的由一个共同的接口被处理的能力。 虽然鸭打字,是一种动态类型的,它允许不同类型的对象,以同样的方法作出回应。
据我了解,多态性更多的是创建可以在不同的类中共享的接口。 鸭打字是关于弱类型,这将使方法,只要它是在消息的接收者发现调用。
它是否正确? 我在两个很困惑,他们似乎相关,但我不知道他们的关系是什么。 非常感谢提前!
多态性 (在面向对象编程的范畴内)是指一个子类可以覆盖基类的方法。 这意味着一个类的方法可以在子类中做不同的事情。 例如:一类Animal
可以有一个方法talk()
和子类Dog
和Cat
的Animal
可以让方法talk()
发出不同的声音。
鸭打字装置的代码将简单地接受具有特定方法的任何对象。 比方说,我们有以下代码: animal.quack()
如果给定对象animal
有我们要调用的方法,然后我们是很好的(无需额外的类型要求)。 这不要紧,无论animal
实际上是Duck
或不同的动物这也恰好嘎嘎。 这就是为什么它被称为鸭打字:如果它看起来像一只鸭子(例如,它有一个方法叫quack()
那么我们就可以就好像该对象是鸭子行动)。
因此,在这些有关系吗? 它们是一种编程语言可能只是独立的功能。 存在具有多态性,但没有鸭子类型(如Java)的编程语言。 还有一些具有多态性与鸭子类型(比如Python)的语言。
这是多态性在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()
Cat
和Dog
)从父类(继承Animal
),并覆盖方法谈。 两型多态性
方法重载: - 相同的函数名和不同的数据类型被称为方法重载
例如:
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
答案很简单:
鸭打字是实现多态性的一种方式。 另一种方法是使用静态类型。
长一点的回答:
这里涉及到两个不同的概念,类型和编程技术。
鸭打字是一种类型的打字。 和打字是指当抛出错误时通过周围的对象不被期望的。 鸭打字是一种打字的地方,它抛出错误时的程序正在运行,正在调用的方法不可用。 静态类型自带的编译时间检查,所以如果该类型信息不匹配,它会在您编译代码抛出错误。 这就是打字。
多态是一种编程技术,您可以允许多种类型的对象履行一定的责任。 您可以通过使用基本类型来表示所有子类类型做到这一点。 您可以使用鸭子类型来表示所有有需要的方法的不同类型。 您可以使用一个接口来代表所有实现该接口的类型。
有回答说多态性是继承,这是不正确的。 虽然你可以使用继承创建多态行为,通常这是你做了什么,但是这并不是是关于什么的多态性。
首先,你不需要继承如上所述具有多态性。
其次,术语“多态性”是依赖于抽象,而不是实现代码的客户端代码的背景下更有意义。 仅仅因为你有一个超类,并从它继承并重写一些方法,并不意味着这是多态的几个其他类,创建多态,你必须编写客户端代码中多态的方式来消耗这些类。