【问题标题】:Reduce boilerplate in class inheritance减少类继承中的样板
【发布时间】:2015-06-23 09:41:10
【问题描述】:

我想知道在这种情况下是否有减少样板代码的技巧:从类继承(假设现实世界有更多的构造函数参数)。

class Person(name: String, surname: String) {
  def fullname = name + " " + surname
  def header = "Dear " + name  
}

class Employee(val aname: String,
              val asurname: String,
              val role: String) extends Person(aname, asurname) {
  }

我见过一些strategies that involved the use of traits

Having an abstract base class is not an option.

【问题讨论】:

    标签: scala inheritance properties constructor


    【解决方案1】:

    问题是,你真的需要扩展基类吗?您链接到的特征方法可能足以满足您的情况。

    也就是说,使用 namesurnamefullnameheader 方法使 PersonEmployee 都实现一个特征:

    trait PersonLike {
      def name: String
      def surname: String
    
      def fullname = name + " " + surname
      def header = "Dear " + name
    }
    

    并让类扩展特征:

    case class Person(name: String, surname: String) extends PersonLike
    case class Employee(name: String, surname: String, role: String) extends PersonLike
    

    案例类可能会更好,但您可以使用普通类代替:

    class Person2(val name: String, val surname: String) extends PersonLike
    class Employee2(val name: String, val surname: String, val role: String) extends PersonLike
    

    【讨论】:

    • tnx.这很有用——我以某种方式重新考虑了在特征中使用“属性方法”的想法,而不仅仅是像 interface 中那样的方法
    【解决方案2】:

    在构造函数中使用 val 创建新的公共成员。使用简化它

    case class Person( name: String, surname: String ) {
      def fullname = name + " " + surname
      def header = "Dear " + name
    }
    
    class Employee( _name: String, _surname: String, val role: String )
    extends Person( _name, _surname )
    

    我还把 Person 改成了 case 类,所以构造函数的参数变成了公共字段。

    如果您希望减少样板文件,我认为使用特征或其他技巧只需添加更多代码。所以,保持简单是我的建议。

    【讨论】:

    • 不需要案例类来从构造函数参数中获取公共字段。 class Person(val name: String, val surname: String) 还将创建公共字段。 Employee 中的下划线将被废弃:class Employee(name: String, surname: String, val role: String) extends Person(name, surname)。在Employee 中,所有三个构造函数参数都可以公开访问。
    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2018-05-23
    相关资源
    最近更新 更多