Реализация класса Java Abstract - PullRequest
2 голосов
/ 08 июля 2010

Предположим, у меня есть абстрактный класс A и абстрактный класс B, который наследуется от A, и я создаю объект класса A, как показано ниже:

abstract class A {
   void func1();
}

abstract class B extends A {
   void func2();
}

A objectA = new A() {
   func1(){
      //implementation
   }
};

Есть ли способ для меня сделать что-то вроде этого:

B objectB = new B(objectA) {
   func2(){
      //implementation
   }
};

так что objectB получает реализацию функций A от objectA?

Ответы [ 4 ]

3 голосов
/ 08 июля 2010

Вы можете сделать это следующим образом (с помощью композиции, поскольку вы не сможете наследовать от анонимного внутреннего класса objectA):

 abstract class A {
    abstract void func1();
 }

 abstract class B extends A {
     A wrapped;
     public B(A objectA) {
         wrapped = objectA;
     }
    abstract void func2();
 }

 A objectA = new A() {
    void func1(){
       //implementation
    }
 };

 B objectB = new B(objectA) {
    public void func1() {
        wrapped.func1();
    }
    public void func2() {
        // impl
    }
 };

AFAIK, вы не можете определить новый конструктор в objectB, поэтому вы вынуждены объявить его в классе B.

2 голосов
/ 08 июля 2010

Я понимаю, что вы хотите сделать.Такие вещи возможны в Ruby, например.В Java это невозможно, потому что

new A() { 
   func1(){  } 
}; 

относится не к типу A, а к анонимному подклассу A, который не суперклассу B.Для этого компилятор генерирует класс $1.

Но, в общем, попробуйте другой подход: «Пользуйся композицией, а не наследованием».Затем вы можете комбинировать func1 и func2 где-нибудь, просто используя два класса Strategy.Поэтому, если B не использует никакого состояния A, вы можете делегировать objectA (тогда должно быть final):

B objectB = new B() { 
   func1(){ 
     objectA.func1()
   } 
   func2(){ 
     //implementation 
   } 
}; 

Это похоже на ответ bashflyng, но большепрямой.

0 голосов
/ 08 июля 2010

Нет.Ваше определение для A является анонимным классом, поэтому нет способа получить этот код.Вероятно, есть несколько сумасшедших шагов к размышлению, чтобы заставить это работать, но не беспокойтесь об этом.Если вы хотите повторно использовать какое-то определение класса, сделайте его собственным именованным классом.

0 голосов
/ 08 июля 2010

Абстрактный класс - это класс, который объявлен абстрактным - он может включать или не включать абстрактные методы.Поэтому, если вы знаете одну из (может быть по умолчанию) конкретных реализаций, вы можете предоставить реализацию func1 (), и она все еще может быть абстрактной.Не ответил на ваш вопрос (я думаю, что ответ НЕТ);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...