2010-11-03 11 views
8

일부 게시물을 읽고 내부 클래스가있는 샘플을 발견했습니다. 최근에 MSDN에서 몇 가지 예제를 통해 특히 많이 봤습니다. 이전에 내부 클래스를 사용할 필요가 없었습니다 (하지만 아마도 내가 있어야 할 것입니다). 그래서 정확히 어떤 점이 궁금합니다. 내부 클래스 (적어도 개인용 클래스는 어쨌든)는 메인 클래스 자체에서만 사용할 수 있다고 가정하므로 내부 클래스가 가지고있는 기능을 외부 클래스의 일부 메서드에 통합하는 것과 동일하지 않습니까? 내부 클래스 뒤의 OO 이유가 있습니까?내부 클래스의 목적은 무엇입니까?

저는 주로 C# 내에서 생각하고 있습니다. 그러나 이것은 내부 클래스를 지원하는 모든 OO 언어에 적용될 수 있다고 생각합니다.

예를 들어 this sample on msdn을 사용하십시오. CharacterCollection 및 WordCollection은 Document 클래스의 공용 클래스입니다. 이것이 Document 클래스 외부에 있다면 어떤 차이가 있을까요?

답변

6

내부 클래스는 포함하는 (또는 외부) 클래스에만 관련된 경우 매우 유용합니다.

개인 내부 클래스의 좋은 예는 외부 클래스에서 노출되지 않는 것을 관리해야하는 경우입니다. 아래 예제에서 캐시 관리자는 객체의 캐싱 및 캐싱을 처리합니다. private 내부 클래스를 사용하여 캐시하려는 객체에 대한 포인터와 마지막으로 액세스 한 시간을 저장합니다. 이 가상 CacheManager 사용자가 CacheEntry에 대해 알 필요가없는 코드.

class CacheManager 
{ 
private: 
    class CacheEntry 
    { 
    private: 
     Object* m_pObjectToCache; 
     int  m_nTicksSinceTouched; 
    }; // eo class CacheEntry 
    std::map<int, CacheEntry*> m_Cache; 

public: 
    Object* getObject(int _id); 
}; // eo class CacheManager 

그러면 공개 내부 클래스의 사례가 제공됩니다. - 차라리 "친구"키워드에서 같은 투표 것

class Tree 
{ 
public: 
    // public class.. Node might pertain to anything in the code, let's keep it simple 
    // and clear that THIS Node belongs and works with THIS Tree class. 
    class Node 
    { 
    };// eo class Node 
}; // eo class Tree 
+0

이 예제에서 Node는 어떻게 사용하겠습니까? 내가 공개적으로 생각할 때, 나는 어떻게 든 Tree 외부에서 접근 할 수 있다고 상상한다. Node가 공개되어 Tree 외부에있는 다른 Node 클래스를 재정의하게 할까? – pinkfloydx33

+0

예, 트리 외부에 있으므로 "Tree :: Node"로 액세스 할 수 있으므로 원하는 Node를 얻을 수 있습니다. 노드를 의미하는 코드의 다른 독자에게는 또한 명확합니다. –

+0

트리 내에서 Tree :: Node 대 SomeOtherNS :: Node를 원한다고 지정할 필요가 없다고 가정합니다. – pinkfloydx33

3

이유 중 하나는 내부 클래스가 주변 클래스의 멤버에 직접 액세스 할 수 있다는 것입니다. 이 멤버들에게 액세스하기 위해 그들은 둘러싼 클래스에 대한 참조를 필요로하지 않습니다. 동시에 다른 객체는 내부 객체에 대한 액세스가 필요할 수 있습니다.

컬렉션의 내부 클래스로 선언 된 반복자의 예를 생각해 볼 수 있습니다. 반복기는 반복되는 컬렉션에 대해 자세히 알고 있어야하지만 클라이언트 코드는 반복자 자체에 대한 객체로 액세스해야합니다. 이터레이터의 기능을 가져 와서 외부 클래스에 포함시킬 수는 없습니다.

아마도 외부 클래스의 책임에는 내부 클래스의 책임이 직접 포함되지 않을 수 있습니다. 그래서 내부 클래스를 생성하면 매우 응집력있는 클래스를 유지하는 데 도움이됩니다.

+0

가 개인적으로 나는이 내부 클래스에 대해 해요 : 이름 (내가 좋아하는 것 간단한 유지) 경우에 나는 다른 곳에서 내 갈등, 중첩 클래스를 사용합니다 C++. –

관련 문제