Java/Scala/C++: Чому вибір overloaded метода робиться під час компіляції?
Код:
// 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 коментар
Додати коментар Підписатись на коментаріВідписатись від коментарів