2010-11-22 95 views
3

我的应用程序类使用一个库中包含默认的两个变量。有什么办法可以从超类中省略变量吗?

// 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类型的对象的操作时。

是否有任何想法扩展该SuperClass不包括这两个变量(id, version)

我不知道该怎么办?

任何建议请问?

谢谢

+2

这些变量在您的子类中是如何显示的?他们被宣布为私人,不受保护。 – 2010-11-22 03:32:43

+2

我猜你正在使用这样的ORM框架,如休眠或JPA?你可以看到这些变量的唯一方法是通过反射。仅仅是你不想让这些变量在你的子类中持久存在? – 2010-11-22 03:47:46

+0

正是男人。如何不坚持这两个变量? – 2010-11-22 03:49:49

回答

1

一般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", [email protected](name="EMP_ID")) 
@Entity 
public class MyClassChild extends SuperClass { 

    private String some column; 
    ... 
} 
+0

我的问题是变量名。我不想让Id和'版本'的版本一样。我的意思是,想要有其他名字。 – 2010-11-22 04:07:22

+0

你的意思是表中的列名或类中的实际方法名,或者两者都有? – 2010-11-22 04:18:55

+0

当我执行'选择,插入或任何操作'的任何操作时,这两个变量'id'&'version'应该在数据库表中。但是,如果在persistence.xml中添加'',则这两个变量将直接映射到创建数据库表列。我想要做的是使用我的主键,例如:“EMP_ID”而不是“ID”,而'版本'不是一个大问题。 – 2010-11-22 06:02:26

1

没有。如果你继承,你会让整个班级都来。如果你不想继承所有的字段,那么你并没有设计一个子类。

想象一下,如果您可以省略变量会发生什么 - 继承方法会对现在缺少的状态做些什么?一切都会中断...

+0

无法实现这种操作? – 2010-11-22 03:35:35

+0

不,它不能实现。 – dteoh 2010-11-22 03:37:45

1

所有你能做的就是让这个变量专用于超类,使得子类不会“看见”它。

0

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

3

您不能删除这些字段,但可以覆盖getter和setter以执行默认操作(取决于其访问修饰符,但它们可能为protected或更大)。例如,这样您可以停止外部分配这些变量。如果你选择这条路线,我建议你熟悉这些字段在超类中的使用方式,以便你能预见到任何连锁行为。

相关问题