是否可以使用扩展抽象类的空子类?

CKi*_*ing 6 java abstract-class subclass

考虑以下:

  public abstract class Item {
     String name;
     String description;
     //concrete getters and setters follow
  }

   public class InventoryItem extends Item {
     //empty subclass of Item 
   }

  public class CartItem extends Item {
     int quantity;
     int tax;
     //getters and setters for quantity and tax follow
  }
Run Code Online (Sandbox Code Playgroud)

InventoryItem表示可供销售的项目,而CartItem表示添加到购物车的项目,因此它具有其他属性,如数量和税金.在这种情况下,是否可以使用抽象类Item的空子类?

选项2:我们可以有一个空的Item接口.InventoryItem将实现Item并定义名称和描述属性,并具有getter和setter.CartItem将从InventoryItem扩展,并将数量和税收定义为属性,并具有getter和setter.

选项3:拥有Item接口会更好吗?InventoryItem将实现Item.然后我们可以有一个CartItem类,它有'一个'项和两个属性,即税和数量

das*_*ght 5

我认为这个设计没有任何问题:它明确指定Item为基础,和InventoryItem/ CartItem作为可实例化的类.我将重命名ItemAbstractItem(Java类库执行此操作)以强调该类的预期用途将用作其他类的基础.

存在C++特定的问题,例如通过基指针的赋值,这使得非常希望使所有"非叶子"类抽象化.虽然规则并没有按字面意思转换为Java,但我认为将非叶类抽象化仍然是一个好主意,即使该类是自给自足的.这有助于您在用于直接实例化的类和用于扩展的类之间进行明确分离,这有助于不熟悉您的代码库的人员进行维护.

进一步采用该规则,Java中的常见做法是制作所有叶类final.这是一个很好的防御规则,特别是当你的类是不可变的时候.

编辑:对于购物车中的建模项目,继承不是最好的选择.事实上,我认为做错了.我会CartItem自己创建一个Item,而不是扩展它,因为该项目不会通过放在购物车中而成为另一种实体.以下是我认为它应该如何建模:

public class Item {
    String name;
    String description;
    ...
}

public class CartItem {
   Item item;
   int quantity;
   int tax;
   ...
}
Run Code Online (Sandbox Code Playgroud)