Вот мой код:
class base
{
void a()
{
System.out.println("base.a");
}
void b()
{
System.out.println("base.b");
}
}
class derived extends base
{
void a()
{
System.out.println("derived.a");
}
void b()
{
System.out.println("derived.b");
}
}
public class Test
{
static void do_something(base _class)
{
base _base = _class;
_base.a();
_base.b();
}
public static void main(String args[])
{
System.out.println("Test");
base a_base = new base();
a_base.a();
a_base.b();
derived a_derived = new derived();
a_derived.a();
a_derived.b();
System.out.println("Test 2");
do_something(a_base);
do_something(a_derived);
}
}
То есть у меня есть 2 класса — родитель и наследник. Есть метод, который должен принимать предка, но в который я могу передать как предка, так и наследника(do_something).
Как я понял, все функции в Java ведут себя как виртуальные (выражаясь терминами c++). То есть, в зависимости от того, кого я передал в метод, те функции и вызовутся (предка или наследника).
Допустим, мне надо, чтобы вне зависимости от того, кого я передал в этот метод, вызывались методы предка (base). В С++ я бы просто сказал, что эта функция не виртуальная. Как я понимаю в Java такого понятия нет, поэтому я попробовал пирвести переданный класс к предку:
base _base = _class;
Но несмотря на это, следующие вызовы:
_base.a();
_base.b();
приводят к вызову методов переданного класса (как предка, так и наследника).
Как сделать, чтобы вне зависимости от переданного класса, вызывались методы класса base.
Если метод "виртуальный", то вызвать реализацию этого метода у предка, имея ссылку на объект базового класса или любого из наследников, нельзя. Но можно сделать метод и "невиртуальным":
class A {
final void op() {...}
}
Здравствуйте Danissimo, Вы писали:
D>Если метод "виртуальный", то вызвать реализацию этого метода у предка, имея ссылку на объект базового класса или любого из наследников, нельзя. Но можно сделать метод и "невиртуальным":
D>D>class A {
D>
D> final void op() {...}
D>}
D>
То есть, если я тебя правильно понял, то это нужно указать у предка(base). Но тогда я не смогу переопределить этот метод у наследника. Следовательно это не то, что мне надо.
Как родитель, так и потомок должны иметь свои методы.
DAS> Как сделать, чтобы вне зависимости от переданного класса, вызывались методы класса base.
Никак. Редизайнь
В java "не виртуально" вызываются статические методы и final методы (а значит private тоже).
Ты лезешь во внутненнюю реализацию объекта, пытаешься использовать свое знание того факта, что он чей-то наследник. Это не есть правильно как мне кажется. Плюс в java принято "специфицировать" API с помощью интерфейсов.
Здравствуйте DemAS, Вы писали:
Экое извращение мне в голову пришло:
class base
{
void a()
{
_a();
}
void a(Class target)
{
_a();
}
void b()
{
_b();
}
void b(Class target)
{
_b();
}
private void _a()
{
System.out.println("base.a");
}
private void _b()
{
System.out.println("base.b");
}
}
class derived extends base
{
void a()
{
_a();
}
void a(Class target)
{
if(target.equals(derived.class))
_a();
super.a(target);
}
void b()
{
_b();
}
void b(Class target)
{
if(target.equals(derived.class))
_b();
super.b(target);
}
private void _a()
{
System.out.println("derived.a");
}
private void _b()
{
System.out.println("derived.b");
}
}
public class Test
{
static void do_something(base _class)
{
_class.a(base.class);
_class.b(base.class);
}
public static void main(String args[])
{
System.out.println("Test");
base a_base = new base();
a_base.a();
a_base.b();
derived a_derived = new derived();
a_derived.a();
a_derived.b();
System.out.println("Test 2");
do_something(a_base);
do_something(a_derived);
}
}