【问题标题】:Replace switch case: interface vs abstract class替换开关盒:接口与抽象类
【发布时间】:2020-08-26 07:36:23
【问题描述】:

我有一个带有 switch 语句的代码,并且想要改进设计。

有接口和抽象类方式。

我想知道哪种方式更好,为什么?

我有以下课程:

enum MovieChargeType {regular, new_release }

class Movie {
    public MovieChargeType type;
    public double get_price(){
          switch (type){
                  case regular: //return regular price
                  case new_release : // return new_release price }
    } 

}

所以我决定使用 2 种方式改进设计:

1 方式 - 接口

Interface MovieType{
    public double get_price();
}

class RegularMovie implements MovieType{
    public double get_price(){
        // return regular price
    }
}

class NewMovie implements MovieType{
    public double get_price(){
        // return new price
    }
}

class Movie{
        public MovieType type;
        public double get_price(){
              type.get_price();
        } 
    
    }

2 Way - 抽象类:

abstract class Movie {
        public MovieChargeType type;
        public abstract double get_price();
    
    }

class RegularMovie extends Movie{
        public double get_price(){
            // return regular price
        }
    }
    
    class NewMovie extends Movie{
        public double get_price(){
            // return new price
        }
    }

我想知道在这种情况下哪个更好? 我注意到人们倾向于使用接口,但有人可以解释为什么吗?

【问题讨论】:

  • 旁注:工作代码的评论......可能最好转到codereview.stackexchange.com(但在发布之前请仔细阅读他们的帮助中心)。附注:了解 java 命名约定。方法名称转到 getPrice()... _ 仅用于 SOME_CONSTANT。
  • Java 命名约定对除常量外的所有内容都使用 camelCase 而不是 snake_case。

标签: java design-patterns polymorphism


【解决方案1】:

我想知道在这种情况下哪个更好?我注意到人们倾向于使用接口,但有人可以解释为什么吗?

继承依赖是所有依赖中最强的,因为你的子类继承了你父类的所有依赖。例如。如果父类依赖于某个库,则只有当该库位于类路径上时才能使用您的子类。也许您之前在 IDE 中遇到了 indirectly referenced from class file 错误。发生此错误是因为您的父类的依赖项不在编译类路径上。

这就是为什么大多数开发人员倾向于使用接口并尽可能简化接口签名的原因。我的意思是你不应该在接口的签名中使用任何库类。仅使用 POJO,以便您的接口仅依赖于纯 Java,而不依赖于其他库。

抽象类在您想要实现template method 模式时非常有用。模板方法定义了一个可以被子类扩展的抽象算法。它们只是覆盖或实现父类的抽象方法。抽象类可以实现行为。因此,如果您的所有子类都有共同的行为,那么抽象类可能是不错的选择。但请记住,抽象应该是稳定的。如果您有经常更改的抽象,那么您的所有子类都会受到影响。这个问题会随着每个层次结构级别而急剧增加,并使您的代码难以维护。一个好的规则是,层次结构中的类越高,它就必须越稳定。

【讨论】:

    【解决方案2】:

    抽象类允许您定义子类可以覆盖的某些方法的默认行为。接口只允许您定义方法的签名,因此每个实现都会有所不同。 如果您希望某些类具有价格的默认行为,请在接口上使用抽象类设计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 2016-03-24
      • 2010-12-01
      • 1970-01-01
      • 2020-08-01
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多