Теоритический вопрос по функциям и наследованию
От: DemAS http://demas.me
Дата: 12.11.02 07:16
Оценка:
Вот мой код:



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.
Re: Теоритический вопрос по функциям и наследованию
От: Danissimo Россия  
Дата: 12.11.02 07:37
Оценка:
Если метод "виртуальный", то вызвать реализацию этого метода у предка, имея ссылку на объект базового класса или любого из наследников, нельзя. Но можно сделать метод и "невиртуальным":

class A {
    
    final void op() {...}
}
Данис Тазеев
Re[2]: Теоритический вопрос по функциям и наследованию
От: DemAS http://demas.me
Дата: 12.11.02 08:31
Оценка:
Здравствуйте Danissimo, Вы писали:

D>Если метод "виртуальный", то вызвать реализацию этого метода у предка, имея ссылку на объект базового класса или любого из наследников, нельзя. Но можно сделать метод и "невиртуальным":


D>
D>class A {
D>    
D>    final void op() {...}
D>}
D>


То есть, если я тебя правильно понял, то это нужно указать у предка(base). Но тогда я не смогу переопределить этот метод у наследника. Следовательно это не то, что мне надо.
Как родитель, так и потомок должны иметь свои методы.
Re: Теоритический вопрос по функциям и наследованию
От: IgorRomanov  
Дата: 12.11.02 08:38
Оценка:
DAS> Как сделать, чтобы вне зависимости от переданного класса, вызывались методы класса base.

Никак. Редизайнь
В java "не виртуально" вызываются статические методы и final методы (а значит private тоже).
Ты лезешь во внутненнюю реализацию объекта, пытаешься использовать свое знание того факта, что он чей-то наследник. Это не есть правильно как мне кажется. Плюс в java принято "специфицировать" API с помощью интерфейсов.
Re: Теоритический вопрос по функциям и наследованию
От: Аноним  
Дата: 12.11.02 12:53
Оценка:
Здравствуйте 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);

    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.