【问题标题】:Can I have an empty Java class?我可以有一个空的 Java 类吗?
【发布时间】:2015-01-22 13:41:01
【问题描述】:

我正在创建一个基于网格的游戏。

我需要实现一组在网格中随机位置的障碍物。 我创建了一个抽象类ALifeForm,它包含网格中每个项目的通用方法。显然,抽象类无法初始化,所以我打算创建一个新类AObstacle,它将扩展ALifeForm

唯一的问题是,我的 AObstacle 课程不是专业的。它需要的所有方法都在ALifeForm内。

我可以有一个空的班级吗? 这是不好的编程习惯吗?如果是这样,我可以实现什么?

【问题讨论】:

  • "我可以有一个空的 Java 类吗?" - 是的。
  • 你尝试的时候发生了什么?
  • 那么为什么ALifeFormabstract,因为它的子类不提供任何东西?
  • 您是否考虑过将您的课程从抽象变为具体?如果一个子类可以是完全副本但具有另一个名称,那么超类可能应该是可实例化的。
  • 你可以考虑一个interface,而不是一个空的abstract

标签: java class abstract


【解决方案1】:

当然……

class AObstacle { }

(加上你正在使用的任何继承模型。)没有什么能阻止你这样做。

请记住,并不是你真正定义的东西。 type 是。类只是用于描述类型的语言/语法结构。如果所描述的类型除了继承模型之外没有任何属性或操作,那么就没有其他东西可以添加了。

虽然您正在添加一件事。你给它一个名字。这听起来并不多,但是用具体名称定​​义语义概念(尤其是在静态类型环境中)非常很重要。您的类型现在具有不同于系统中其他类型的标识。如果稍后添加内容,则可以在无需重构和破坏性更改的情况下添加它们。

【讨论】:

  • 虽然从抽象类继承的空类可能是代码异味,但有时它们是描述您要建模的结构的最佳方式。从问题中对场景的描述来看,这种情况似乎有一点需要注意:障碍物真的是一种生命形式吗?也许ALifeForm 应该重命名为AGridItem 或类似的东西,包括生物和无生命的障碍。
  • @biziclop:非常正确。我们对被建模的领域了解得不够多,无法确定。这可能违反了 Liskov Substitution 作为设计考虑,与语言是否支持空类完全分开。
【解决方案2】:

要做到这一点,您不需要有一个抽象类和一个扩展它的类,或者一个空类(这也是可能的)。

第一种方式:

您只需要实现两个类:包含您需要使用的方法和变量的类,以及具有第一个类的实例的第二个类:

public class A{
  public void firstMethod(){
    //do your stuff here
  }
....
}

public class B{
  public static void main(String[] args) {
   A a=new A(); //instantiate your class here 
   a.firstMethod();// then just use its methods
  }
}

因为如果你实现一个扩展抽象类的类,它应该实现它的所有方法。

第二种方式:

  • 或者,如果您希望您的第二节课更加专业,您可以:

你的第一个类不应该是抽象的,第二个可以扩展它并使用它的所有方法,并有它的特定方法

【讨论】:

  • 虽然这在技术上是正确的,但并不总是好的做法。
  • @biziclop 是的,没错,但这只是一种做法,而且我真的不知道这一切的目的是什么!!
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多