繁体   English   中英

有关范围的一般编程问题

[英]General programming question about scope

这更多是一个通用的编程问题,因此我给出的代码示例只是伪代码。 我使用C ++,Java和Python进行编程,因此伪代码是这些代码的混合体。 我不太确定它的名字叫什么,因此,如果您可以给我起一个名字,我可以Google索取更多信息,对此我将不胜感激。

假设我有一个名为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,所以我不能/不想使用继承。

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

我在遵循您的伪代码时遇到麻烦,但是您可以通过以下方式完成所需的操作:

  • 继承 ,它允许派生类访问基类中的受保护变量(静态或实例变量)
  • 朋友函数 (C ++)(允许函数访问类上的私有实例变量)
  • 依赖注入 (但仅当您的要求比您在问题中实际陈述的要复杂时,才可能。在这种超简单的情况下,当实例传递给函数时,您只是在访问公共属性或字段,您可以可能必须通过公共getter / setter访问它们,因为您希望变量是私有的)

编辑:

编辑后,很明显您需要Observer Design Pattern 这使您可以将响应状态更改的代码与表示状态更改的代码分离。

这种模式与访问变量(如我的第一个链接所涉及的)相比,与其说是对事件(或“状态转换”,如果您将类视为有限状态机 )响应,不如说是对变量的访问。

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

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

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

(不过,我同意@mellamokb:这可能不是一个好主意,因为它在两个类之间建立了非常紧密的耦合。您可能想重新考虑您的类结构。您究竟打算将其用于什么?)

明确地传递this (或绕this的代理)几乎是唯一可行的方法(无论如何),假定它们需要是独立的对象。 一个对象不能也不需要知道其引用的数量和位置。 即使您可以获得所有对其自身的引用的列表,该列表也可以轻松包含局部变量,集合中的项以及可能的A多个实例,等等-应该如何知道选择哪个作为其父对象?

如果B实际上“是” A ,则应使其成为子类。

还有什么其他方法可以使用B类内部的A类变量?

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

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

为了减少对象之间的耦合,您不应该让B引用A-您应该给A引用由A实现的接口。这种差别很细微,但这确实使您考虑了真正需要什么操作或数据。跨接口边界共享。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM