2013-10-07 3 views
0

나는 MyLib이라는 클래스로 항목의 인벤토리를 구축 중이므로 라이브러리 초기화에는 상당한 시간이 걸리고 한 번만 수행하면됩니다. 그런 다음 해당 항목 클래스를 사용하여 인벤토리의 모든 항목 인스턴스를 임의로 만들 수 있지만 라이브러리 인스턴스화가 없으면 항목 인스턴스화를 허용해서는 안됩니다. 이 방법이 가능하다는 것을 알 수있는 유일한 방법은 아래와 같이 라이브러리 클래스 안에 항목 클래스를 중첩시키는 것입니다. 그러나이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다.중첩 클래스를 사용하는 대신 C#으로 하위 개체를 만드는 방법이 있습니까?

public class MyLib 
{ 
    protected string LibFilePath; 

    public MyLib() 
    { 
     /* Time-consuming Library initialization code here 
      needs to be done only once 

     LibFilePath initialized 
     etc. 

     */ 
    } 

    public class LibItem1 
    { 
     /* Must ensure that MyLib is initialized 
     * Must have access to Library information like LibFilePath, etc. 
     */ 
    } 
} 
+2

[Factory Pattern] (http://en.wikipedia.org/wiki/Factory_method_pattern)을 살펴 봐야합니다. 그것은 당신의 문제를 해결할 수 있습니다. 이 방법을 제안하는 이유는 지금 작성된 방식이기 때문에 초기화가 있다는 사실을 숨기고 있기 때문입니다. 팩토리 패턴을 사용하면 일부 논리가 발생하는 것으로 알려져 있습니다. –

답변

1

당신은 다음과 같이이 강제 할 수 있습니다 :

public class MyLib 
{ 
    public static void InitializeMyLib(...) 
    { 
     if (instance != null) 
     { 
      throw new InvalidOperationException("Already initialized"); 
     } 

     instance = new MyLib(...); 
    } 

    public static MyLib GetInstance() 
    { 
     if (instance == null) 
     { 
      throw new InvalidOperationException("Not initialized"); 
     } 

     return instance; 
    } 

    private MyLib(...) 
    { 
     ... 
    } 

    private static MyLib instance; 
} 

public class LibItem1 
{ 
    public LibItem1() 
    { 
     MyLib.GetInstance(); // will throw if doesn't exist 
    } 
} 

싱글을 갖는 여기 OK 경우

-이 클래스의 행동 정장의 당신의 설명이 패턴. 물론 일반 예외는 단순화를 위해 사용되며 InitializeMyLibGetInstance 개의 별도 메서드 대신 일반 용도로 처음 사용할 패턴을 사용할 수 있습니다. 그러나, 나는 이것이 사실이 아님을 짐작하고있다. 그러면 초기화 전에 Libitem1을 생성하는 것을 금지 할 필요가 없다.

+0

응답 해 주셔서 감사합니다. LibItem1 생성자에 MyLib 클래스 매개 변수를 추가하고 MyLib 클래스에 메서드를 추가하여 MyLib 필드에 직접 액세스하는 대신 LibItem1에서 요청한 작업을 수행하여이 문제를 해결했습니다. – user2852294