문제

이 질문은 이미 여기에 답이 있습니다.

구체적으로, 중첩 클래스를 언제 또는 언제 사용하지 않을지에 대한 구체적인 예를 나에게 줄 수 있습니까?

나는이 기능에 대해 영원히 알고 있었지만 그것을 사용할 이유가 없었습니다.

감사.

도움이 되었습니까?

해결책

중첩 클래스가 외부 클래스에서만 사용되는 경우, 더 이상 필요하지 않은 훌륭한 예는 컬렉션의 열거 자 클래스를위한 것입니다.

또 다른 예는 열거가 클래스 내에서 메소드에서 사용하는 진정한 잘못된 매개 변수를 대체하여 통화 서명을 명확히하기위한 것일 수 있습니다 ...

대신에

public class Product
{
    public void AmountInInventory(int warehouseId, bool includeReturns)
    {
        int totalCount = CountOfNewItems();
        if (includeReturns)
            totalCount+= CountOfReturnedItems();
        return totalCount;
    }
}

그리고

  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, true);  

'진정한'의 의미에 대해 불분명하게 말하면 다음을 쓸 수 있습니다.

public class Product
{
    [Flags]public enum Include{None=0, New=1, Returns=2, All=3 }
    public void AmountInInventory(int warehouseId, Include include)
    {
        int totalCount = 0;
        if ((include & Include.New) == Include.New)
            totalCount += CountOfNewItems();
        if ((include & Include.Returns) == Include.Returns)
            totalCount += CountOfReturns();
        return totalCount;
    }
}


  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, Product.Include.All);  

클라이언트 코드에서 매개 변수 값을 명확하게합니다.

다른 팁

내가 중첩 된 클래스를 사용하는 두 곳 :

  • 중첩 클래스는 외부 클래스에서 독점적으로 사용되며 완전히 개인 범위를 원합니다.

  • 중첩 클래스는 특별히 다른 곳에 정의 된 인터페이스를 구현하는 데 특별히 사용됩니다. 예를 들어, 열거자를 구현하는 것이이 범주에 속합니다.

중첩 클래스가 다른 곳에서 사용될 것이라는 의미가 없다고 확신 할 때 중첩 클래스를 사용하고 싶어합니다.

예를 들어, 단기간에 해당 객체 세트에 대한 함수 및 멤버 정보와 함께 연관된 여러 유형의 객체 목록을 작성 해야하는 경우 (메서드 또는 속성과 같은) 중첩 클래스를 사용하여이를 수행 할 수 있습니다. 어쩌면 일부 유형의 객체의 모든 조합 목록을 작성한 다음 특정 속성이있는 모든 조합을 표시해야합니다. 그것은 중첩 된 수업에 좋은 경우 일 것입니다.

중첩 클래스에서 방법이 필요하지 않으면 아마도 구조 그러나 IL이 그들을 다르게 취급하는지 모르겠습니다.

때로는 부모 클래스 내부에서 한두 가지 기능에 필요한 간단한 도우미 클래스에 이것을 사용합니다.

실질적인 예는 오늘 아침 일찍 묻는이 질문을 참조하십시오.
같은 어셈블리에서 다른 객체 만 액세스 할 수 있도록 객체를 액세스 할 수 있습니까?

요약 : 비즈니스 객체 내부의 관련 데이터 클래스를 중첩 할 수 있습니다.

특수 목적 데이터 구조가 하나의 클래스 내에서만 사용되거나 특정 예외가 한 클래스 내에서만 발생하고 잡히는 경우 중첩 클래스의 경우를 보았습니다.

시스템의 다른 개체에 볼 필요가없는 도우미 클래스가있을 때 클래스를 둥지합니다. 이것은 가시성을 가능한 한 제한된 것으로 유지하여 클래스의 의도하지 않은 사용을 방지합니다.

응집력에 대한 밥 삼촌의 '규칙'에 따라 실제로 많은 중첩 (그리고 중첩, 중첩) 클래스를 만들어냅니다. 이것들 ~할 수 있었다 비 네스트로 만들어졌지만 지금 참조하는 다른 고객이있는 경우.

이전 답변을 개선하고 싶습니다!

중첩 클래스를 정기적으로 사용하는 특정 영역은 인터페이스 주입 및 제어 역전을 가능하게합니다. 예시...

public class Worker
{
  private IHelper _helper;

  public Worker()
    : this (new DefaultHelper())
  {
  }
  public Worker(IHelper helper)
  {
    this._helper = helper;
  }

  private class DefaultHelper : IHelper
  {
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top