关于范围的一般编程问题

时间:2011-08-01 18:56:29

标签: java c++ python

这更像是一个通用的编程问题,所以我给出的代码示例只是伪代码。我使用C ++,Java和Python编程,因此伪代码是这些的混合。我不太清楚这个叫什么名字,所以如果你能给我一个名字,我可以谷歌了解更多相关信息我会非常感激。

假设我有一个名为A的类。在这个类中,我创建了一个名为B的类的实例:

class A {
    //instance variables
    classB;
    variable1;
    variable2;

    //instance methods
    instanceFunction(parameter1, parameter2) {
        //Do Stuff
    }

    function1(parameter1) {
        classB = new B(some parameters);
    }

    setVariable1(value) {
        variable1 = value;
    }

    getVariable2() {
        return variable2;
    }
}

在B类中,我想在A类中更改或使用实例变量。我可以通过将A的引用传递给B来实现这一点。所以我的A :: function1看起来像这样:

function1(parameter1) {
    variable1 = new B(this, other parameters);
    //Python syntax:
    //variable1 = B(self, other parameters)
}

我的B级看起来像这样:

class B {
    //instance variables
    parentClass;
    variable2;

    //instance methods
    instanceFunction(classA, other parameters) {
        parentClass = classA;
    }

    function1() {
        parentClass.setVariable1(someValue);
    }

    function2() {
        variable2 = parentClass.getVariable2();
    }
}

还有哪些方法可以在B类中使用A类中的变量?

如果代码是C ++或Java,则假设所有变量都是私有的,并且所有方法和函数都是公共的。还假设所有变量都通过引用或指针传递。

编辑:

首先,感谢所有回复!

一些澄清:

我问这个问题的原因是我在C ++和Python中做了大量的Qt编程。在Qt中,有信号和插槽。这允许内部对象告诉外部对象做某事。例如,我有一个对象A,其中包含对象B和C.对象B发生了一些变化,B需要让A和C知道。所以B会发出一个信号。 A将抓住这个信号并做它需要做的事情。然后,A也会让C知道B发出了这个信号。这样C就可以做它需要做的事情。

我问我问题的原因是因为我想知道如何在不使用Qt库的情况下做我所描述的事情。

另外,我们假设B“不是”A,所以我不能/不想使用继承。

6 个答案:

答案 0 :(得分:2)

  

我不太确定这叫什么名字......

我无法关注您的伪代码,但您可以通过以下方式完成所需的工作:

  • Inheritance,允许派生类从基类(静态或实例变量)访问 protected 变量
  • Friend functions(C ++)(允许函数访问类上的私有实例变量)
  • Dependency Injection(但可能只有当你有更复杂的要求而不是实际陈述你的问题。在这个超级简单的情况下,你只是在实例传递时访问公共属性或字段进入函数 - 您可能必须通过公共getter / setter访问它们,因为您希望变量是私有的)

修改

完成修改后,很明显您需要the Observer Design Pattern。这允许您将响应状态更改的代码与指示状态更改的代码分离。

这种模式不是关于变量的访问(就像我的第一个链接那样),而是关于响应事件(或“状态转换”,如果你认为你的类是Finite State Machine)。 / p>

答案 1 :(得分:2)

鉴于你所做的编辑;使用boost::signals或线程安全信号2(也在boost中)实现sig / slot机制可能是切实可行的。这意味着您正在寻找类似于Qt的sigslot机制的行为。还有很多选择,请看SO问题here

答案 2 :(得分:0)

在C ++中,有一个朋友类的概念:一个类A可以声明另一个类B成为它的朋友,这会给出B访问A的私有变量。只需在friend class B;内写A即可。 (正如@delnan提醒我们的那样,您仍需要手动为B提供A

在Java中,如果您在B内声明A,则B将成为内部类。内部类只能从外部类的实例中实例化,内部类的实例将绑定到外部类的相应实例,并且可以访问其私有变量。

(我同意@mellamokb的观点:这可能是一个坏主意,因为它在两个类之间创建了非常紧密的耦合。你可能想重新考虑你的类结构。你究竟想用它来做什么?)

答案 3 :(得分:0)

明确地传递this(或者围绕this的代理)几乎是唯一(理智,无论如何)这样做的方式,假设它们需要是单独的对象。对象不能也不应该知道其引用的数量和位置。即使你可以获得所有对自身的引用的列表,该列表也可以很容易地包含局部变量,集合中的项目,可能包含A的几个实例等等 - 它应该如何知道选择哪一个它的父母?

如果B实际为"is an" A,您应该将其设为子类。

答案 4 :(得分:0)

  

在A类中使用变量还有哪些其他方法   在B级里面?

由于您的变量不是static,因此它们是实例变量,因此variable1variable2仅在A的特定实例的上下文中有意义 - 所以需要引用该实例,而不管你如何塑造它。

例如,Java中的内部类可以直接使用封闭外部类的变量,但实际上这只是编译器维护的错觉,而在字节码中,内部类实际上保留了对外部类实例的引用

答案 5 :(得分:0)

为了减少对象之间的耦合,你不应该让B引用A - 你应该给它一个由A实现的接口的引用。区别是微妙的,但它确实让你思考什么动作或数据确实需要跨接口边界共享。