Programing

다형성의 실제 예

lottogame 2020. 12. 10. 08:24
반응형

다형성의 실제 예


누구든지 다형성의 실제적인 예를 제게 줄 수 있습니까? 교수님은 +운영자에 대해 항상 들었던 것과 동일한 오래된 이야기를 들려줍니다 . 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

반응형