Как вызвать переопределенные методы абстрактного класса - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть сценарий, как

Вот абстрактный класс

    abstract class A
    {
            public void add()
            {
                    //do something
            }
    }

Вот класс, который расширяется над абстрактным классом

    class B extends A
    {
            @Override
            public void add()
            {
                    //do something else
            }
    }

Вот класс, в котором я хочу вызвать оба метода add

    class C
    {
            A a = new B();

            // Calls B's add method

            a.add();

            // Call A's add method ???
    }

Как вызвать метод add A ???

Ответы [ 6 ]

9 голосов
/ 10 ноября 2011

Вы не можете. В этом весь смысл полиморфизма и инкапсуляции - вы создали экземпляр B, поэтому B решает, что означает add. Возможно, B пытается ввести в действие некоторые бизнес-правила, например, когда вы можете вызвать add - было бы бесполезно, если бы вы могли обойти эти правила и вызвать A.add() непосредственно для экземпляра B. Реализация B.add() может решить, когда и следует ли звонить super.add(), но код за пределами B не может принять это решение.

1 голос
/ 10 ноября 2011
class B extends A
{
//over ride method
public add()
{
    //do something else
}

public add2()
{
    super.add();
}
}


class C {
A a = new B();

// Calls B's add method
a.add();

// Call A's add method
a.add2();
}
1 голос
/ 10 ноября 2011

Как объясняли выше разные люди, вы не можете.Если мы попытаемся понять, чего вы хотите достичь, я думаю, вам нужен интерфейс и два класса.

interface AddInterface {
 public void add();
}

class A implements AddInterface {
//your abstract class' version of add goes here
}

class B implements AddInterface {
//your other add definition.
}

В итоге вы замените ссылки на A на AddInterface.Опять же, все зависит от того, чего вы хотите достичь.

1 голос
/ 10 ноября 2011

Вы ищете super.

class B extends A
{
        //over ride method
        public add()
        {
                super.add();
                //do something else
        }
}
1 голос
/ 10 ноября 2011

Вы не можете, потому что это сломало бы полиморфизм.Если B переопределяет add метод A, это потому, что он должен добавить другим способом, чтобы удовлетворить свой контракт.Если сделать это не так, как нужно, это сломает инварианты Б. и, вероятно, также инварианты А.

0 голосов
/ 11 ноября 2011

Я получил то, что хочу, но по-другому, вот как ---

    class D extends A
    {
            public add()
            {
                    //Log here..........
                    super.add();
            }
    }

Это поможет мне не заставлять B вызывать реализацию A по умолчанию, избегая super.add ();

Как мы переписали, чтобы изменить функциональность.

    class C
    {
            A a = new B();
            // Call B's Add method
            a.add();

            a = new D();
            // Call A's Add method via D
            a.add();
    }

Я думаю, что нет лучшего способа, чем этот :)

...