代码之家  ›  专栏  ›  技术社区  ›  Mohamed Saligh

有什么方法可以从超级类中省略变量吗?

  •  3
  • Mohamed Saligh  · 技术社区  · 15 年前

    我的应用程序类使用一个库,其中有默认的两个变量。

       // A class from framework:
    
    public class SuperClass implements Serializable {
    
      private long id;
      private long version;
    
      // getter and setter methods for these variables...
    
    }
    

    我应该扩展这个类,以便访问框架的一些功能。

    如果我像这样把这个班扩展到我自己的班上:

    public class MyClassChild extends SuperClass {
    
      private long myprimarykey;
      private String some column;
      private long myversion;
    
      // getter and setter methods for these variables...
    
    }
    

    根据编程模型,这两个变量也是可访问的。 在实现需要类型为的对象的操作时 SuperClass .

    有没有办法扩展不包含这两个变量的超类 (id, version) ?

    我不知道该怎么办?

    有什么建议吗?

    谢谢

    5 回复  |  直到 15 年前
        1
  •  1
  •   Dean Povey    15 年前

    一般来说,JPA不允许重写超类映射以删除属性,但根据提供程序的不同,可以执行以下操作:

    public class MyClassChild extends SuperClass {
    
      private long myprimarykey;
      private String some column;
      private long myversion;  
    
      // Override superclass mappings
      @Transient
      long getId() { return super.getId(); }
      @Transient
      void setId(long id) { return super.setId(long id); }
      // etc...
    }
    

    编辑

    此外,还可以使用 @AttributeOverride 注释,例如。

    @AttributeOverride(name="id", column=@Column(name="EMP_ID"))
    @Entity
    public class MyClassChild extends SuperClass {
    
      private String some column;
      ...
    }
    
        2
  •  3
  •   akf    15 年前

    不能删除这些字段,但可以重写getter和setter来执行默认值以外的操作(这取决于它们的访问修饰符,但它们可能是 protected 或更大)。例如,这样可以停止这些变量的外部赋值。如果您选择此路径,我建议您熟悉这些字段在超类中的使用方式,以便您可以预期任何连锁反应。

        3
  •  1
  •   Steven Schlansker    15 年前

    不。如果你是继承人,你可以让整个班级都来。如果你不想继承所有的字段,你就不是在设计一个子类。

    想象一下,如果可以省略变量,会发生什么情况——继承的方法会对现在丢失的状态做些什么?一切都会破碎。。。

        4
  •  1
  •   Ken D    15 年前

    你所能做的就是让这个变量成为超级类的私有变量,这样子类就不会看到它。

        5
  •  0
  •   fastcodejava    15 年前

    当你扩展一个类时,你应该添加更多的变量和方法,你不能减去。