Java中的抽象variables?
我来自C#这很容易,可能的。
我有这个代码:
public abstract class clsAbstractTable { public abstract String TAG; public abstract void init(); }
但Eclipse告诉我我使用非法修饰符。
我有这个class级:
public class clsContactGroups extends clsAbstractTable { }
我想以这种方式定义variables和方法,即Eclipse来提示我 ,我没有实现抽象variables和方法。
我如何定义我的抽象类,以便提示实现摘要?
编辑1
我将为不同的数据库表创build不同的类。 每个类应该有它自己的TABLENAMEvariables,没有例外。 当我创build一个扩展抽象类的新类时,我必须确保这个variables是静态的。
然后在抽象类中,我将有一个方法,例如:init();
如果在这个init()方法中我调用TABLENAME,它应该从子类中取值。
像这样的事情也应该解决
String tablename=(clsAbstract)objItem.TABLENAME; // where objItem can be any class that extended clsAbstract;
编辑2
我想在每个类中定义一个常量(静态),它的名称在抽象中定义。
- 我在抽象中定义variablesTABLENAME,但没有给出值。
- 我创build了一个clsContactGroups,我应该提示实现TABLENAME,这是获取一些数据的地方。 例如:TABLENAME =“contactgroups”;
- 我创build了第二个类clsContacts,我应该提示实现TABLENAME,这是获取一些数据的地方。 例如:TABLENAME =“联系人”;
等等…
我认为你的困惑是与C#属性与字段/variables。 在C#中,不能定义抽象字段,即使在抽象类中也是如此。 但是,您可以定义抽象属性,因为这些属性是有效的方法(例如编译为get_TAG()
和set_TAG(...)
)。
正如有些人提醒的那样,即使在C#中,也不应该在类中使用公共字段/variables。 有几个答案暗示了我会推荐的内容,但还没有说清楚。 您应该使用getTAG()将您的想法作为JavaBean属性转换为Java。 那么你的子类将不得不实现这个(我也写了一个表类的项目这样做)。
所以你可以有一个像这样定义的抽象类…
public abstract class AbstractTable { public abstract String getTag(); public abstract void init(); ... }
然后,在任何具体的子类中,你需要定义一个静态的最终variables(常量),并从getTag()
返回,如下所示:
public class SalesTable extends AbstractTable { private static final String TABLE_NAME = "Sales"; public String getTag() { return TABLE_NAME; } public void init() { ... String tableName = getTag(); ... } }
编辑 :
您不能覆盖inheritance的字段(在C#或Java中)。 你也不能重写静态成员,不pipe它们是字段还是方法。 所以这也是最好的解决scheme。 我改变了上面的init方法示例,以显示如何使用这个方法 – 同样,将getXXX方法看作一个属性。
在抽象类中定义一个构造函数来设置字段,以便具体实现按照调用/覆盖构造函数所需的规范。
例如
public abstract class AbstractTable { protected String name; public AbstractTable(String name) { this.name = name; } }
扩展AbstractTable
,只有在添加调用super("somename")
的构造函数时才能编译该类。
public class ConcreteTable extends AbstractTable { private static final String NAME = "concreteTable"; public ConcreteTable() { super(NAME); } }
这样实现者需要设置name
。 通过这种方式,您也可以在抽象类的构造函数中进行(空)检查,使其更加健壮。 例如:
public AbstractTable(String name) { if (name == null) throw new NullPointerException("Name may not be null"); this.name = name; }
没有Java(或C ++)中的抽象variables。
如果父类有一个variables,并且一个子类扩展了父类,那么孩子不需要实现这个variables。 它只需要访问父项的实例。 获取/设置或保护访问将做。
“…所以我应该提示执行摘要”? 如果你扩展一个抽象类而不能实现一个抽象方法,编译器会告诉你要么实现它,要么把子类标记为抽象类。 这就是你会得到的所有提示。
只需将此方法添加到基类
public abstract class clsAbstractTable { public abstract String getTAG(); public abstract void init(); }
现在每个扩展基类的类(不想抽象)都应该提供一个TAG
你也可以用BalusC的答案
你可以做的最好的是有variables的访问器/增变器。
像getTAG()
这样,所有的实施类将不得不执行它们。
抽象类用于定义抽象行为而不是数据。
由于没有variables的实现,所以不能抽象;)
为什么你想要所有的子类来定义variables? 如果每个子类都应该有它,只需在超类中定义它。 顺便说一下,考虑到不pipe怎么说,不要暴露田地是好的OOP练习,你的问题就更没有意义了。
将代码更改为:
public abstract class clsAbstractTable { protected String TAG; public abstract void init(); } public class clsContactGroups extends clsAbstractTable { public String doSomething() { return TAG + "<something else>"; } }
这样,所有inheritance这个类的类都会有这个variables。 你可以做200个子类,每个子类都有这个variables。
注意:不要使用CAPS作为variables名; 普遍的看法是所有的标识符都是指常量,即不可改变的数据。
要添加每类元数据,也许注释可能是正确的方法。
但是,不能在接口中强制实现注释,就像无法强制使用静态成员或存在特定的构造函数一样。
在java中定义抽象属性有两种方法, 没有将属性标记为抽象。
第一种方法:在抽象类中定义一个参数化的构造函数,如下所示:
public abstract class clsAbstractTable { private String TAG; public clsAbstractTable (String TAG) { this.TAG= TAG; } }
在抽象类中定义参数化构造函数时,子类被迫定义自己的构造函数并调用超级构造函数,从而传递它们自己的TAG 。
第二种方法:将属性定义为getter方法,如下所示:
public abstract class clsAbstractTable { public abstract String getTAG(); }
这样TAG属性的值就被委托给每个具体类定义了。
来源: 在java中定义一个抽象属性
不,Java不支持抽象variables。 这也没有什么意义。
variables的“实现”到底需要一个子类来做什么具体的改变?
当我在基类中有一个abstract
String
variables时,子类应该做些什么来使其非抽象?