Java/Scala/C++: Чому вибір overloaded метода робиться під час компіляції?
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.
Код:
// Java class Parent { } class Derived extends Parent { } class SomeClass { void someMethod(Parent p) { System.out.println("Parent."); } void someMethod(Derived d) { System.out.println("Derived."); } } Parent a = new Derived(); (new SomeClass()).someMethod(a); // виведеться "Parent."
// Scala class Parent {} class Derived extends Parent {} class SomeClass { def someMethod(p: Parent) = println("Parent.") def someMethod(d: Derived) = println("Derived.") } val a: Parent = new Derived() (new SomeClass).someMethod(a) // виведеться "Parent."
// C++ class Parent { public: virtual ~Parent() { } }; class Derived : public Parent { public: virtual ~Derived() { } }; class SomeClass { public: void someMethod(Parent* p) { std::cout << "Parent." << std::endl; } void someMethod(Derived* d) { std::cout << "Derived" << std::endl; } }; Parent* a = new Derived(); SomeClass* c = new SomeClass(); c->someMethod(a); // виведеться "Parent." delete a; delete c;
Які, на вашу думку, причини такого проектування мов? Тільки швидкодія у час виконання програми?
Відповідь ніби зрозуміла тільки для Scala: сумісність.
61 коментар
Додати коментар Підписатись на коментаріВідписатись від коментарів