2016-10-21 2 views
0

У меня есть класс java.Как обрабатывать дополнительные случаи в конструкторе подкласса?

Class ClassA { 
    ClassA(int type) 
    { 
     switch(type) 
     { 
      case 1: handleType1(); break; 
      case 2: handleType2(); break; 
      default: throw new IllegalArgumentException(); break; 
     } 
    } 

    private void handleType1(){} 
    private void handleType2(){} 
} 

Теперь мне нужно добавить поддержку типа 3 и типа 4. Но я не могу изменить код ClassA.

Поэтому я думал, что напишу ClassB, который расширяет ClassA и добавляет поддержку для type3 и type 4, как показано ниже.

Class ClassB extends ClassA{ 
    ClassB(int type) 
    { 
     case 3: handleType3(); break; 
     case 4: handleType4(); break; 
     default: 
     { 
      try{ 
       /* To support type 1 and type 2. */ 
       super(type); 
      } catch(IllegalArgumentException e) { 
       /* Handle exception. */ 
      } 
     } break; 
    } 

    private void handleType3(){} 
    private void handleType4(){} 
} 

Я думал, что это сработает. Но я получил «». Вызов super() должен быть первым выражением в корпусе конструктора «Ошибка в конструкторе ClassB.

Я читал this post, и я понимаю, почему super() должен быть первым выражением в конструкторе.

Я могу обратиться к своему прецеденту, написав полный код ClassA в ClassB и добавив поддержку типов 3 и 4. Но я хочу знать, есть ли какие-либо более эффективные решения этой проблемы.

+1

Я думаю, что есть проблема с приложением архитектуры когда дело доходит до таких сомнений ... – xenteros

ответ

0

Теперь я должен добавить поддержку для типа 3 и типа 4. Но я не могу изменить код ClassA.

Тогда ClassBне может разумно подкласс ClassA. Подкласс должен вызывать конструктор родительского класса. (The неразумным способ, которым это может подкласс будет лежать в ClassA конструктор, передавая другого типа.)

В идеале, ClassA и ClassB бы одновременно реализовать интерфейс, а остальная часть приложения будет закодирован для использования этого интерфейса, а не ClassA или ClassB.

0

родительский класс должен правильно инициализировать (через явно или неявно вызова конструктора родительского класса) во время инициализации дочернего класса, но в вашем случае родительского класса не могут быть инициализированы типов 3 и 4 (и без типов тоже) ,

0

У вас серьезный дефект дизайна.

выключатели в целом сильный признак того, что вы должны использовать интерфейсов и полиморфизма.

Код, который вы в настоящее время есть в конструкторе A должен быть в заводе класса, и должна быть реализация интерфейса объявляющего общие методы для каждого handleTypeX