2014-09-12 2 views
1

У меня есть класс, который позволяет использовать BImpl, которые реализуют интерфейс B и C абстрактный класс. Оба супер класса есть метод, как DoSomething(), которые реализованы в абстрактном классе C.Избегайте метода переопределения просто вызывает тот же метод, определенный в нарушении сонара суперкласса во множественном наследовании

interface B 
{ 
Some doSomething(); 
} 

abstract class C 
{ 
protected Some doSomething() 
{ 
    //Do something here... 
} 
} 

И я реализовать BImpl следующим образом:

class BImpl extends C implemensts B 
{ 
    public Some doSomething() 
    { 
    super.doSomething() 
    } 
} 

Так я выставить абстрактное поведение класса с объектом типа B. С этим сценарием я получаю нарушение PMD (в сонаре), которое говорит: «Метод переопределения просто вызывает тот же метод, определенный в суперклассе». Это совсем не так, потому что я выставляю другое поведение родителя. Как я могу избежать этого?

ответ

0

только идея, тип?

public Some doSomething(){ 
    ((B)this).doSomething() 
} 
1

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

2

Это правило known limitation этого правила PMD и связанное с ним правило Squid (SonarQube). Не стесняйтесь голосовать за решение этой проблемы в следующей версии плагина Java.

+0

Да, согласен с вами. Но мой сценарий немного отличается. Я переопределяю одного родителя и внутри него вызываю другую родительскую реализацию той же сигнатуры метода. Таким образом, это будет другой сценарий, который необходимо учитывать с этим правилом. Я прав? – chAmi

2

1) Похоже, что у вас не хватает введенной реализации. Он должен быть следующим:

class BImpl extends C implements B 
{ 
    public Some doSomething() 
    { 
    super.doSomething() 
    } 
} 

потому что класс не может расширить интерфейс или реализовать абстрактный класс.

2) в соответствии с моим пониманием вашего вопроса реализация doSomething() в BImpl избыточна.

Class BImpl extends C implements B { 

} 

логически эквивалентен вышеуказанной реализации. Именно поэтому SONAR дает нарушение. Ну, если doSomething() в BImpl имеет другую логику, чем в абстрактном классе. Я не думаю, что SONAR даст какое-либо нарушение, так как не будет избыточной логики.