访问内部类的私有成员变量?

9
Class Outer
{
 ...
    private class Node
    {
      private T data;
      ...

      private T getData()
      {
         return data;
      }
    }
}

如果外部类可以访问内部类的私有成员,那么使用set和get方法的目的是什么?将内部类设置为私有的目的是什么?还有包访问权限的作用是什么?


1
请在问题中标注您所使用的编程语言。 - Donal Fellows
@Donal,看起来像是Java。 - Jacob Relkin
唐纳尔,这是一个相当与语言无关的问题...更像是一个通用的面向对象编程问题。 - Polaris878
1
@Jacob:我也这么认为,但不能排除其他可能性;原问题提出者应该明确说明。 - Donal Fellows
2
这是与编程语言相关的内容。一些面向对象的编程语言没有内部类的概念,而其他语言则有不同的规则来访问或被访问。我已经添加了Java标签,因为原帖中提到了包。 - anon
抱歉,各位。我本来想加上Java标签的,但由于我在这里的声望不够,我只能使用一个标签。因此,我使用了更符合我的问题的那个标签。 - ShrimpCrackers
3个回答

12

私有内部类用于当你不想将类暴露给包内或包外的其他类时,只在外部级别类中使用。

由于可以直接访问实例变量,因此通常不需要在私有类中使用getter和setter方法。


4

您可以跳过琐碎的getter和setter方法,但通常这些方法是非琐碎的(常见情况是“延迟加载”模式)。

编辑以添加: 延迟加载是仅在请求数据时才实例化成员的过程。当不总是需要获取数据且获取数据时代价很高时,就会使用它。

class a
{
private:
    int m_aNumber;
    bigDeal *m_pBig;

public:
    a() { m_aNumber = 0; m_pBig = NULL; }
    ~a() { if (m_pBig) delete m_pBig; }

    // trivial
    int get_aNumber() { return m_aNumber;}
    void set_aNumber(int val) { m_aNumber = val; }

    // lazy load
    bigDeal *get_Big()
    {
        if (m_pBig == NULL)
        {
            // bigDeal::bigDeal() downloads data from Mars Rover
            // takes 20 minutes, costs $1.2 million dollars to run
            m_pBig = new(bigDeal); 
        }
        return m_pBig;
    }
    void set_Big(bigDeal *val)
    {
        m_pBig = val;
    }
}

1
首先,我会建议你对待内部的public/protected/internal类与对待其他“外部”类一样。也就是说,使用相同的设计原则。
至于内部类,当我使用内部的private类时,它们通常只是一堆字节...意味着它们不进行实际处理。它们只是为了让编写外部类的代码更容易而存在。
我并不是要求你写糟糕的代码,但在设计上,你可以更加自由放松地处理内部的private类。一般来说,它们应该简单轻量化...不要在内部类上过度使用面向对象。而且,如果你需要更改内部类中的任何内容,你只需要更新外部类中的引用...这实际上并不是什么大问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接