2011-07-06 1 views
0

나중에 여러 사람들이 사용할 수있는 라이브러리를 만들고 있습니다.클래스를 작성하는 방법 : 특정 (고유 한) 필드가있는 객체 하나만 만들 수 있습니다!

class WrapperMoveable 
{ 
    IMoveable moveable; 

    public WrapperMoveable(IMoveable moveable) 
    { 
     this.moveable = moveable; 
    } 
} 

문제 : WrapperMoveable 클래스를 편집하여 특정 IMoveable이있는 특정 개체가 존재할 수 있는지 확인하는 방법입니다. 누군가가 일부 인터페이스로 랩퍼 오브젝트를 작성하려고 시도하고 해당 인터페이스를 가진 랩퍼 클래스가이 L 존재하면 mechanizm은 기존 랩퍼 오브젝트를 리턴해야합니다.

몇 가지 해결책이 있지만 먼저 문제에 대해 먼저 생각해보십시오.

솔루션 :

  1. 는 생성 된 모든 래퍼 객체를 포함하는 래퍼 클래스의 정적 필드를 만듭니다.

    class WrapperMoveable 
    { 
        IMoveable moveable; 
    
        static List<WrapperMoveable> createdWrappers = new List<WrapperMoveable>(); 
    
        private WrapperMoveable(IMoveable moveable) 
        { 
         this.moveable = moveable; 
        } 
    
        public static WrapperMoveable CreateWrapper(IMoveable moveable) 
        { 
         if (createdWrappers.Any(e => e.moveable == moveable)) 
          return createdWrappers.First(e => e.moveable == moveable); 
    
         WrapperMoveable newWrapper = new WrapperMoveable(moveable); 
         createdWrappers.Add(newWrapper); 
    
         return newWrapper; 
        } 
    } 
    

    이 방법은 프로그래머가 새로운 키워드를 사용하여 normaly 개체를 만들 수 없다는 점에서 문제가 있습니다. 따라서 프로그래머는 정적 메서드로만 객체를 만들 수 있다는 것을 알아야합니다. 또한 참조가 항상 createdWrappers에 존재하므로 garbridge 수집기는 객체를 해제하지 않습니다.

  2. 래퍼 클래스를 만드는 WrapperFactory 클래스를 만듭니다. 이전 예에서 proggramer는 래퍼 객체를 생성하는 방법을 알고 있어야합니다. 이 솔루션에서는 팩토리 클래스를 사용합니다.

  3. WrapperMoveable 유형의 메모리에있는 모든 객체를 스캔하고 객체에 제공된 인터페이스가 있는지 확인하십시오.

이 문제의 해결책은 무엇입니까? 당신 자신의 더 나은 해결책이 있습니까?

답변

0

클래스에 정적 int를 생성하고 개수를 계산할 수 있습니까? int가 1보다 큰 경우 예외가 발생합니까?

+0

게시물의 몸체를 읽어주세요. – MaciejLisCK

+0

정적 인 int = 0을 만들 것입니다. 참조 카운트로 사용하십시오. 카운트가 newwrapper가 이미 생성되었다고 표시되면 다른 사람이 그것을 작성합니다. 네가 뭘 할거야? – Steve

0

'new'연산자를 제어하려는 경우; 공장 패턴을 사용하는 것이 유일한 방법입니다. 첫째로, 당신의 수업은 그 자체에 대해 창조하는 것에 대한 약간의 논리를 안다. Factory에서는이 논리를 클래스에서 분리합니다. 그리고 그것은 좋은 무언가입니다.

작성 래퍼에 추가 매개 변수가 필요하다고 생각합니다.

public static WrapperMoveable CreateWrapper(IMoveable moveable, EndPoint ep) 
{ 
     if (createdWrappers.Any(e => e.EndpointObject == endpoint)) 

세 번째의 경우. 생성 및 삭제를 제어하는 ​​gc와 비슷한 리스너를 작성할 수 있습니다.

하지만 문제는 wrapperMoveable에있는 것 같습니다. 랩퍼를 작성하고 인스턴스 작성 후에 엔드 포인트 특성을 설정합니다. 그리고 래퍼 생성은 해당 속성과 관련이 있습니다 (인스턴스 목록은 필터링 속성을 알지 못합니다). 생성 순서를 바꾸면 더 좋을 수 있습니다.

+0

오, 내가 코드에서 실수를 저질렀습니다. 이제는 맞습니다! – MaciejLisCK

+0

오해가 있기 때문에 공장을 사용하는 것을 두려워합니다. 필자가 작성한 코드는 라이브러리로 컴파일되어 다른 사람들이 사용하게 될 것입니다. 나는 그들이 WrapperMoveable 클래스를 발견했을 때 클래스를 생성하는 정적 메소드를보다 쉽게 ​​발견했다면 클래스가 분리되어 발견 될 것이라고 생각한다. – MaciejLisCK

+0

클래스 WrapperMoveable { IMoveable moveable; 정적 HashSet 작성된 Wrappers = 새 HashSet (); \t 개인 WrapperMoveable (IMoveable 이동 가능) { this.moveable = moveable; } \t \t \t 공개 WrapperMoveable CreateWrapper 정적 (가동 IMoveable) { 경우 (createdWrappers.Any (E => e.moveable == 이동)) 창 createdWrappers.First의 (e => e.moveable == 이동); WrapperMoveable newWrapper = new WrapperMoveable (moveable); createdWrappers.Add (newWrapper); return newWrapper; } – MaciejLisCK

관련 문제