【问题标题】:Sharing data between objects, binding properties在对象之间共享数据,绑定属性
【发布时间】:2014-02-13 13:53:35
【问题描述】:

我对对象数据共享有一些想法。

  • 让我们用属性p1p2定义类C(让我们认为它是不可变的)。
  • 让我们有一些 C 类的对象 XY
  • 让我们为 C 类的对象创建某种“容器”G。 “容器” G 具有属性 gp1
  • 让我们将对象 X 添加到“容器”G 并使用 G.gp1 值“绑定”X.p1。 (Bind 确实说当对象 X 尝试获取属性 p1 的值时,它会获取 gp1 的值。)
  • 让我们将对象 Y 添加到容器 G 并使用 G.gp1 值“绑定”Y.p1

您可能认为这对人类来说很简单。

我想到的唯一想法是为 p1, p2 属性访问创建接口。然后在Class C(无共享数据)和Class GC(有容器数据)中实现接口。然后装饰对象添加方法。

如您所见,每个绑定都添加了一个接口 + 接口实现。写的太多了,有点丑。

问题: 如何为每个对象创建这种绑定操作? (不实现 DSL,使用 C 派生语言:java、C#、C++、php、...)

【问题讨论】:

  • 在类中有一个字段并通过getter返回另一个类中的另一个字段是什么意思?这是非常危险的建筑。
  • 它可能是一个虚拟字段。

标签: oop


【解决方案1】:

问题出在哪里? p2 是干什么用的?

static class G{
    int gp1;
}
static class C{
    int p1,p2;
    G provider; 
    C(G provider){
        provider=this.provider;
    }
    int getP1(){
        return provider.gp1; 
    }
}
static class X extends C{
    X(G provider){
        super(provider);
    }
}
static class Y extends C{
    Y(G provider){
        super(provider);
    }
}

只有当我们通过接口提供提供者时,解决方案才能通用。但是你不想使用它。没有接口的通用解决方案在这里是不可能的。

interface IProvider{
    int getGp1();
}
static class G implements IProvider{
    private int gp1;
    int getGp1(){return gp1};
}
static class C{
    int p1,p2;
    IProvider provider; 
    C(IProvider provider){
        provider=this.provider;
    }
    int getP1(){
        return provider.gp1; 
    }
}
static class X extends C{
    X(G provider){
        super(provider);
    }
}
static class Y extends C{
    Y(G provider){
        super(provider);
    }
}

请注意,在类中有一个字段并通过 getter 返回另一个类中的另一个字段是非常不直观且危险的构造

【讨论】:

  • 问题是 X 和 Y 是为特定容器构建的,没有它就不能使用。因此,要制作通用对象,您需要创建更多类,这就是我不想要的。
  • @user1759572 只有当我们通过其接口提供提供者时,它才能通用。但是你不想使用它。没有接口的通用解决方案在这里是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多