Java中的抽象变量?

新手上路,请多包涵

我来自 c#,这很容易,而且是可能的。

我有这段代码:

 public abstract class clsAbstractTable {

    public abstract String TAG;
    public abstract void init();

}

但是 Eclipse 告诉我我使用了非法修饰符。

我有这个类:

 public class clsContactGroups extends clsAbstractTable {

}

我想要以这种方式定义的变量和方法,让 Eclipse 提示我,我有未实现的抽象 变量 和方法。

我需要如何定义我的抽象类,以便提示我实现抽象?

编辑 1

我将为不同的数据库表创建不同的类。每个类都应该有自己的 TABLENAME 变量,无一例外。每次我创建一个扩展抽象类的新类时,我都必须确保这个变量是静态的。

然后在抽象类中我将有一个方法,例如:init();

如果在这个 init() 方法中我调用了 TABLENAME,它应该从子类中获取值。

这样的事情也应该解决

String tablename=(clsAbstract)objItem.TABLENAME;
// where objItem can be any class that extended clsAbstract;

编辑 2

我想要在每个类中定义一个常量(静态),它的名称以抽象形式定义。

  • 我抽象地定义了变量 TABLENAME,但没有给出任何值。
  • 我创建了一个 clsContactGroups,我应该被提示执行 TABLENAME,这是获取一些数据的地方。例如:TABLENAME=“联系人组”;
  • 我创建了第二个类 clsContacts,系统会提示我执行 TABLENAME,这是获取一些数据的地方。例如:TABLENAME=“联系人”;

ETC…

原文由 Pentium10 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 881
2 个回答

我认为您的困惑在于 C# 属性与字段/变量。在 C# 中,您不能定义抽象字段,即使在抽象类中也是如此。但是,您可以定义抽象属性,因为它们是有效的方法(例如编译为 get_TAG()set_TAG(...) )。

正如一些人所提醒的那样,你永远不应该在你的类中有公共字段/变量,即使在 C# 中也是如此。几个答案暗示了我会推荐什么,但没有说清楚。您应该使用 getTAG() 将您的想法作为 JavaBean 属性转换为 Java。然后你的子类将不得不实现这个(我也写了一个带有表类的项目)。

所以你可以像这样定义一个抽象类……

 public abstract class AbstractTable {

    public abstract String getTag();
    public abstract void init();

    ...
}

然后,在任何具体的子类中,您需要定义一个静态最终变量(常量)并从 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();
        ...
    }

}

_编辑_:

您不能覆盖继承的字段(在 C# 或 Java 中)。您也不能覆盖静态成员,无论它们是字段还是方法。所以这也是最好的解决方案。我更改了上面的 init 方法示例以显示如何使用它 - 再次将 getXXX 方法视为一个属性。

原文由 Kevin Brock 发布,翻译遵循 CC BY-SA 2.5 许可协议

在设置字段的抽象类中定义一个构造函数,以便具体实现符合调用/覆盖构造函数所需的规范。

例如

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 。通过这种方式,您还可以在抽象类的构造函数中进行 (null) 检查,以使其更加健壮。例如:

 public AbstractTable(String name) {
    Objects.requireNonNull(name, "Name may not be null");
    this.name = name;
}

原文由 BalusC 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题