我有一个类,比如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(在声纳中)违规,称“重写方法只调用了超类中定义的相同方法”。这对我来说是不对的,因为我暴露了其他家长的行为。我如何避免这种情况?
如果您不同意某些 Sonar 规则(这并没有错),默认配置文件中的某些规则是有争议的,只需从您用于分析项目的配置文件中禁用,违规将在下次分析后消失。
1) 看起来您没有键入实现。应该如下所示:
class BImpl extends C implements B
{
public Some doSomething()
{
super.doSomething()
}
}
因为类不能扩展接口或实现抽象类。
2)根据我对你的问题的理解,BImpl中do的实现是多余的。
Class BImpl extends C implements B {
}
在逻辑上等效于上述实现。这就是声纳违规的原因。好吧,如果 BImpl 中的 doSomething() 与抽象类中的逻辑不同。我不认为 SONAR 会给出任何违规行为,因为不会有多余的逻辑。
这是此PMD规则和相关Squid(SonarQube内部)规则的已知限制。请随时在下一版本的 Java 插件中投票支持此问题的解决方案。
我是一名新的Java开发人员,在Java中继承的概念定义我的类时遇到了一些困难。。。 在一方面,我有一个通用的类,名为车辆,它定义了几十年的属性(带有它们的getter/setters)。我有一个扩展车辆类的车辆1类。 另一方面,我有一个名为VehicleFactory的泛型类,它定义了一个静态方法,如下所示: 问题是我想创建一个Vehicle1Factory类,它有自己的makeResult方法
问题内容: 我有两个课,和。它们看起来像这样: 此错误指向Field的: 我希望首先调用Background init ()。要将“ a,b”传递给Fields的 init (),Field会分配a和b,然后将其中包含三个0的列表分配给field。然后让Background的 init ()继续,然后调用它自己的buildField()并用包含c的列表覆盖self.field。 似乎我还没有完全理
当基类给成员命名时,名字就赋予了语义。在任何情况下,子类最好都不要将同一个名字用作其他目的。但为什么有很多其他原因子类会使用同一个名字。它可能想用不同方式实现同一个语义,或者有不同的参数。有时这是语言原生就支持:类设计者可以声明一个虚函数,子类就可以各自实现语义。原则33包含了为什么使用 new 修饰符 可能导致很难发现代码的 bug 。在这个原则里,你将会学到重写基类定义的函数会导致类似的问题。
我有一个基类,它定义了类方法,用于返回用于构建服务url的各种信息。基类还定义了一个用于构建该url的实例方法。我希望基类有这个方法的默认实现,这样当我需要url不同时,我只需要在子类中重写它。我如何让这个基方法调用重写的类方法来使用子类中的类方法构建url?下面是我现在的代码,但它不起作用: 基类方法: op ationId、operationVersion和方法类型是在子类中实现的类方法,但是
超类 子类
问题内容: 假设我有以下两个课程 如果我启动一个beta类型的新对象,如何执行在alpha类而不是beta中找到的逻辑?我可以使用<-我想知道是否可行。 Eclipse IDE中的自动键入功能使我可以选择从class 或class中进行选择。 问题答案: 你可以做: 注意,这是对父级的引用,但是super()是它的构造函数。