2010-03-10 5 views
5

.NET에서 중첩 된 유형과 관련된 특정 시나리오의 경우 좋은 연습이 무엇인지 궁금합니다.public 인 중첩 된 유형

Wheel 클래스가 있고 Wheel 클래스에 Bearing 객체가 있다고 가정 해 보겠습니다. Bearing 객체는 Wheel 내에서만 의미가 있으며, 독립적으로 생성되도록 허용하고 싶지 않으므로 Bearing 클래스를 Wheel 객체 내부에 중첩시켜야합니다. 그러나 이제 Wheel 클래스 외부의 Wheel.Bearings 속성을 읽어야하는 시나리오가 있다고 가정 해 보겠습니다. 이제는 중첩 된 Bearing 클래스를 공개해야합니다.

이 경우 가장 좋은 옵션은 무엇입니까?
1 - 휠 클래스
2 중첩 공공 베어링 클래스를 생성 - 생성자
3의 휠 오브젝트를 독립적 인 베어링 클래스를 생성 - 휠 네임 스페이스를 만들고이 네임 스페이스 내에서 독립적 인 베어링 클래스를 만들 수 있습니다.
4 - 다른 것?

업데이트 : 자세한 내용으로 업데이트하고 지금까지 제안 사항 중 일부를 반영하려고합니다. ClassParent는 부모 클래스이고 ClassChild는 자식 클래스입니다. ClassChild는 항상 ClassParent의 하위 클래스이며 자체적으로 존재하는 것은 아닙니다. 문제는 ClassChild에는 공개적으로 노출되어야하는 몇 가지 속성이 있지만 나머지는 ClassParent에서만 호출해야한다는 것입니다. ClassParent는 적절한 정리 및 수정 작업을 수행해야하므로 ClassParent에서만 호출해야하므로 Public으로 공개해서는 안되는 ClassChild.Delete 함수가 그 예입니다.

제안을 검토 한 결과, 내가 생각해 낸 디자인이 나에게는 약간 부정 해 보였으므로 내가 입력을 요청할 것이라고 생각했습니다. 내가 가진 :

public class Parent 
{ 
    ChildNested childObj 

    public DeleteChild() 
    { 
     //expose this method publically 
     childObj.DeleteChild() 
     //other functionality 
    } 

    public Child GetChild() 
    { 
     //expose Child, not ChildNested publically 
     return childObj 
    } 

    private class ChildNested:Child 
    { 
     public Child() 
     { 
       Base.Child() 
     } 
     public DeleteChild() 
     { 
       Base.Delete() 
     } 
    } 

public abstract class Child 
{ 
protected Child() 
    { 
    } 
protected Delete() 
    { 
    } 
    public PublicPropertyToExpose() 
    { 
    }  
} 

답변

8

여기에 최고의 디자인은 internal 생성자와 공공 Bearing 클래스를 생성하고 Wheel 클래스 내에서의 인스턴스를 생성하는 것입니다.

Bearing 클래스는 Wheel 클래스의 private 멤버에 액세스 할 필요가있는 경우, 공용 Bearing 클래스 abstract은 다음 Wheel의 내부 private 중첩 된 클래스로 구체적인 implentation을 만들 수 있습니다.

일반적으로 you should not make public nested types입니다.

+0

+1. 나는 완전히 동의한다. 중첩 된 유형은 읽기가 어렵고 따라하기가 어렵습니다. 당신이 그들에 대해 프로그램 할 때 당신은 항상 아웃 타입을 지정할 필요가 있는데, 이것은 꽤 성가시다. – Steven

+0

그러나 시나리오가 휠 없이는 베어링이 결코 존재할 수 없으며 존재할 수 없다면 어떻게 될까요? 이 경우 휠없이 실제로 Bearing 객체를 만들 수 있기 때문입니다. 예를 들어 Keyboard 클래스와 Key 클래스는 키보드없이 키 바디 키를 가질 수 없습니다. –

+0

두 개 이상의 공용 클래스가 있지만 "publicly"파생 가능하지 않은 클래스를 만드는 방법이 있습니까? 기본 클래스를 public으로하고 개인 생성자를 사용하고 파생 클래스를 가짐 그 안에 중첩 된? 클래스 계층 구조를 디자인 할 때, 나는 종종 내가 공개 클래스가되고 싶은 것들이 다른 클래스 안에 갇혀있는 모퉁이에 박스가 붙어있는 것처럼 보입니다. 내가 원하는 것보다 더 큰 범위를주는 것 이외의 다른 좋은 방법이 있습니까? – supercat

1
  • 주어진 휠 클래스
을 베어링 클래스를 인스턴스화하는 공장 클래스를 만듭니다 개인 생성자
  • 와 독립적 인 베어링 클래스를 생성 내가 독립적으로 "베어링"를 테스트하고 싶은, 그래서 것
  • +0

    또는 베어링에 "CreateBearing"이라고 말하는 휠을 사용하는 방법이 있습니다. –

    1

    두 번째 옵션을 선택하십시오.

    1

    베어링은 세계 어느 곳에서나 휠 외부에서 사용할 수있을만큼 유용하기 때문에 자체적으로 존재할 수 있습니다.

    바퀴는 베어링을 사용하여 집계되지만 바퀴는 베어링을 정의하지 않습니다. 베어링은 유용하며 바퀴 이외의 다른 것들에도 사용될 수 있습니다.

    베어링에 대한 공용 속성이 필요하다는 사실은 휠 외부의 공용 클래스 여야한다는 것을 나타냅니다.

    또한 휠을 다시 만들면 어떻게됩니까? (우리 모두는 ...). 어쩌면 마이크로 터빈에 존재하는 것과 같은 새로운 "에어 베어링"을 사용할 수 있습니다. 이제 Wheel 클래스 안에 여러 가지 베어링 유형이 있으며 그 중 일부는 사용되지 않습니다.

    저는 Wheeling 클래스가 아닌 동일한 네임 스페이스 안에 Bearing을 넣을 수 있습니다. 드물게 내면 수업을 필요로하지 않습니다. 일반적으로 익명의 클래스가 필요한 간격을 채 웁니다.

    관련 문제