다형성의 실제 예
누구든지 다형성의 실제적인 예를 제게 줄 수 있습니까? 교수님은 +
운영자에 대해 항상 들었던 것과 동일한 오래된 이야기를 들려줍니다 . 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
Wikipedia 예제를 확인하십시오. 높은 수준에서 매우 유용합니다.
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?"
You see, millionares and grad students are both persons. But when it comes to paying a bill, their specific "pay the bill" action is different.
A common real example in Python is file-like objects. Besides actual files, several other types, including StringIO and BytesIO, are file-like. A method that acts as files can also act on them because they support the required methods (e.g. read
, write
).
A C++ example of polymorphism from the above answer would be:
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.
}
참고URL : https://stackoverflow.com/questions/3724110/practical-example-of-polymorphism
'Programing' 카테고리의 다른 글
Netbeans에서 파일 검색 속도 향상 (0) | 2020.12.10 |
---|---|
fullcalendar에 더 많은 텍스트 표시 (0) | 2020.12.10 |
알림에서 애플리케이션 및 스택 재개 (0) | 2020.12.10 |
AngularJS 지시문 : UI에 반영되지 않은 $ scope 변경 (0) | 2020.12.10 |
iOS8-iOS11의 액션 시트 대리자에서 모달로 뷰 컨트롤러 표시 (0) | 2020.12.10 |