英文:
Can you add a decorator to parent methods and variables from a child class?
问题
可能在父类的字段或方法上添加一个 @ 装饰器而不隐藏它(不使用 super)吗?
> 下面的代码产生了如下结果:<br>
> colA = null,colA = Hello World,ttl = 360*<br><br>
请注意 toString 方法在父类中输出 null。
abstract class TableA {
protected String colA;
public String toString() {
return "colA = " + this.colA;
}
}
class TableAImpl extends TableA {
//@Computed("ttl(value)")
int myTtl;
// *** 注意这个 ***
//@PartitionKey
protected String colA;
public TableAImpl(int ttl, String colA) {
this.myTtl = ttl;
this.colA = colA;
}
// *** 注意这个 ***
public String toString() {
return super.toString() + ", colA = " + this.colA + ", ttl = " + this.myTtl;
}
}
public class HelloWorld {
public static void main(String[] args) {
TableAImpl a = new TableAImpl(360, "Hello World");
System.out.println(a.toString());
}
}
背景:<br>
我需要支持多种数据库类型,因此我有一个通用的 Entity 类,它被特定于数据库的实现类重载。这些特定于数据库的类重载/添加了与该数据库交互的特定逻辑,应该对调用者不可见。
对于其中一个使用的数据库,Java 驱动程序的逻辑主要是通过向实体类的方法和属性添加 @ 装饰器来完成的,它们用于生成辅助代码。
当我尝试使用下面的代码为它们添加装饰器时,子类的变量会隐藏父类的变量。
英文:
Is it possible to add a @ decorator to a parent class's field or method without hiding it (without using super)?
>Code below produces:<br>
>colA = null, colA = Hello World, ttl = 360<br><br>
notice the toString has null for the parent
abstract class TableA {
protected String colA;
public String toString() {
return "colA = " + this.colA;
}
}
class TableAImpl extends TableA {
//@Computed("ttl(value)")
int myTtl;
//*** NOTICE THIS ***
//@PartitionKey
protected String colA;
public TableAImpl(int ttl, String colA) {
this.myTtl = ttl;
this.colA = colA;
}
//*** NOTICE THIS ***
public String toString() {
return super.toString() + ", colA = " + this.colA + ", ttl = " + this.myTtl;
}
}
public class HelloWorld{
public static void main(String []args){
TableAImpl a = new TableAImpl(360, "Hello World");
System.out.println(a.toString());
}
}
Context:<br>
I need to support multiple database types so I have a generic Entity class which are overloaded by DB specific Implementation classes. These DB specific classes overload/add the specific logic to interface with that DB, which should be invisible to the caller.
For one of the DBs used, the java driver's logic is primarily done by adding @Decorators to the Entity Class's methods and attributes which it uses to generate helper code.
When I try the below code to add decorators to them, the child class's variables hide the parent's
答案1
得分: 2
你从未设置父类的 `colA` 属性。
public TableAImpl(int ttl, String colA) {
this.myTtl = ttl;
this.colA = colA;
super.colA = colA;
}
为了保护父类的 `colA` 属性,你应该将其设置为私有并使用 `private` 关键字以及像下面这样的 `getter` 方法:
abstract class TableA {
private String colA;
public TableA() {}
public TableA(String colA) {
this.colA = colA;
}
public String toString() {
return "colA = " + this.colA;
}
protected String getColA() {
return colA;
}
}
class TableAImpl extends TableA {
//@Computed("ttl(value)")
int myTtl;
public TableAImpl(int ttl, String colA) {
super(colA);
this.myTtl = ttl;
}
public String toString() {
return super.toString() + ", colA = " + this.getColA() + ", ttl = " + this.myTtl;
}
//*** 注意这里 ***
//@PartitionKey
@Override
public String getColA() {
return super.getColA();
}
}
public class Main{
public static void main(String []args){
TableAImpl a = new TableAImpl(360, "Hello World");
System.out.println(a.toString());
// colA = Hello World, colA = Hello World, ttl = 360
}
}
英文:
You've never set parent's colA
attribute.
public TableAImpl(int ttl, String colA) {
this.myTtl = ttl;
this.colA = colA;
super.colA = colA;
}
To protect parent's colA
you should set it private with private
and a getter
like so :
abstract class TableA {
private String colA;
public TableA() {}
public TableA(String colA) {
this.colA = colA;
}
public String toString() {
return "colA = " + this.colA;
}
protected String getColA() {
return colA;
}
}
class TableAImpl extends TableA {
//@Computed("ttl(value)")
int myTtl;
public TableAImpl(int ttl, String colA) {
super(colA);
this.myTtl = ttl;
}
public String toString() {
return super.toString() + ", colA = " + this.getColA() + ", ttl = " + this.myTtl;
}
//*** NOTICE THIS ***
//@PartitionKey
@Override
public String getColA() {
return super.getColA();
}
}
public class Main{
public static void main(String []args){
TableAImpl a = new TableAImpl(360, "Hello World");
System.out.println(a.toString());
// colA = Hello World, colA = Hello World, ttl = 360
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论