誰でも私に実際の生活、ポリモーフィズムの実践例を教えてもらえますか?私の教授は、私が+
演算子。 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
ウィキペディアの例を確認してください:高いレベルで非常に役立ちます:
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.name + ': ' + animal.talk()
# prints the following:
#
# Missy: Meow!
# Mr. Mistoffelees: Meow!
# Lassie: Woof! Woof!
次のことに注意してください。すべての動物は「話します」が、話し方は異なります。したがって、「トーク」動作は、動物によって異なる方法で実現されるという意味で多形的です。したがって、抽象的な「動物」の概念は実際には「話す」ことはありませんが、特定の動物(犬や猫など)にはアクション「話す」の具体的な実装があります。
同様に、「追加」操作は多くの数学エンティティで定義されていますが、特定の場合、特定のルールに従って「追加」します。1+ 1 = 2、ただし(1 + 2i)+(2-9i)=(3-7i )。
多態的な動作により、一般的なメソッドを「抽象」レベルで指定し、特定のインスタンスに実装できます。
あなたの例:
class Person(object):
def pay_bill(self):
raise NotImplementedError
class Millionare(Person):
def pay_bill(self):
print "Here you go! Keep the change!"
class GradStudent(Person):
def pay_bill(self):
print "Can I owe you ten bucks or do the dishes?"
百万長者と大学院生はどちらも人です。しかし、請求書の支払いに関しては、彼らの具体的な「請求書の支払い」アクションは異なります。
Pythonの一般的な実際の例は、 ファイルのようなオブジェクト です。実際のファイルの他に、 StringIO および BytesIO 、はファイルに似ています。ファイルとして動作するメソッドは、必要なメソッド(read
、write
など)をサポートしているため、ファイルに対しても動作できます。
上記の答えからのポリモーフィズムのC++の例は次のとおりです。
class Animal {
public:
Animal(const std::string& name) : name_(name) {}
virtual ~Animal() {}
virtual std::string talk() = 0;
std::string name_;
};
class Dog : public Animal {
public:
virtual std::string talk() { return "woof!"; }
};
class Cat : public Animal {
public:
virtual std::string talk() { return "meow!"; }
};
void main() {
Cat c("Miffy");
Dog d("Spot");
// This shows typical inheritance and basic polymorphism, as the objects are typed by definition and cannot change types at runtime.
printf("%s says %s\n", c.name_.c_str(), c.talk().c_str());
printf("%s says %s\n", d.name_.c_str(), d.talk().c_str());
Animal* c2 = new Cat("Miffy"); // polymorph this animal pointer into a cat!
Animal* d2 = new Dog("Spot"); // or a dog!
// This shows full polymorphism as the types are only known at runtime,
// and the execution of the "talk" function has to be determined by
// the runtime type, not by the type definition, and can actually change
// depending on runtime factors (user choice, for example).
printf("%s says %s\n", c2->name_.c_str(), c2->talk().c_str());
printf("%s says %s\n", d2->name_.c_str(), d2->talk().c_str());
// This will not compile as Animal cannot be instanced with an undefined function
Animal c;
Animal* c = new Animal("amby");
// This is fine, however
Animal* a; // hasn't been polymorphed yet, so okay.
}