2009-06-09 2 views
0

.NET API가있는 응용 프로그램의 플러그인을 작성하고 있습니다. 프로그램의 개체는 키/값 쌍을 개체에 할당하는 루트 개체 형식의 두 가지 메서드를 통해 적용되는 사용자 지정 특성을 가질 수 있습니다.래퍼 클래스의 생성자를 작성하는 올바른 방법은 무엇입니까

BaseAppObject.GetUserString(string key, string value); 
BaseAppObject.SetUserString(string key, ref string value); 

나는 의 인스턴스 BaseAppObject 주위의 래퍼 클래스의 역할을 내 자신의 사용자 정의 클래스의 집합을 만드는거야. 모든 클래스는 클래스 에서 파생됩니다. 노드에는 BaseAppObject에 대한 참조를 저장하는 필드가 있습니다. 노드 파생 다른 노드의 속성 및 종류를 읽거나 또는 관련 BaseAppObjects 문의 속성 값을 쓸 GetUserString와 연관된 BaseAppObject 인스턴스 SetUserString 방법을 사용한다. 이 방법으로 응용 프로그램이 닫히면 이러한 래퍼 클래스를 나중에 다시 생성하는 데 필요한 모든 정보가 실제 문서에 저장됩니다.

다음은 기본 클래스 생성자에 대한 간단한 버전입니다. 노드에서 파생

public abstract class Node 
{ 
    BaseAppObject _baseObject; 

    public Node(BaseAppObject baseObject, string name) 
    { 
     this._baseObject = baseObject; 
     this.Name = name; 
    } 

    public string Name 
    { 
     get { 
       string name = ""; 
       _baseObject.GetUserString("CPName", ref name); 
       return name;    
      } 

     set { 
       _baseObject.SetUserString("CPName", value); 
      } 
    } 
} 

다른 클래스는 다음과 같이 추가 속성을 추가 할 수 있습니다.

public CustomClass:Node 
{ 
    public CustomClass(BaseAppObject baseObj,string name, string color):base(baseObj,name) 

    public string Color 
    { 
     get { 
       string name = ""; 
       this.BaseObject.GetUserString("Color", ref name); 
       return name;    
      } 

     set { 
       this.BaseObject.SetUserString("Color", value); 
      } 
    } 
} 

나는 설정으로 시작하고 내 클래스의 인스턴스를 다시 생성 할 수있는 생성자와 내 수업의 다른 방법을 가장 좋은 방법을 알아 내려고 노력하고있어. 인스턴스 인 BaseAppObject을 기반으로하는 클래스의 새 인스턴스를 만들 수 있어야하며 사용자 문자열이 정의되어 있지 않으며 기존 BaseAppObject에 저장된 사용자 문자열을 기반으로 기존 클래스 인스턴스를 다시 생성해야합니다.

답변

1

이전에 기존 클래스를 다시 생성하는 방법을 이미 알고있는 것처럼 보입니다. 값이없는 깨끗한 객체를 생성하려면 매개 변수없이 _baseObject를 만드는 추가 오버로드를 제공하기 만하면됩니다. 이 방법으로 개체를 만든 후에는 해당 속성을 사용하여 멤버 값을 설정할 수 있습니다. 빈 객체를 생성하고이를 채우기위한

public abstract class Node 
{ 
    BaseAppObject _baseObject; 
    //Empty constructor 
    public Node() 
    { 
     BaseAppObject = new BaseAppObject(); 
    } 
    public Node(BaseAppObject baseObject, string name) 
    { 
     this.BaseObject = baseObject; 
     this.Name = name; 
    } 

    public string Name 
    { 
     get { 
       string name = ""; 
       _baseObject.GetUserString("CPName", ref name); 
       return name;    
      } 

     set { 
       _baseObject.SetUserString("CPName", value); 
      } 
    } 
} 

public CustomClass:Node 
{ 
    // Empty constructor 
    public CustomClass() : Base() {} 
    public CustomClass(BaseAppObject baseObj,string name, string color):base(baseObj,name) 

    public string Color 
    { 
     get { 
       string name = ""; 
       this.BaseObject.GetUserString("Color", ref name); 
       return name;    
      } 

     set { 
       this.BaseObject.SetUserString("Color", value); 
      } 
    } 
} 

샘플 코드 : 나는 내 모든 래퍼에서 상속이 기본 래퍼 개체를 작성했습니다

CustomClass node = new CustomClass(); 
node.Name = "foo"; 
node.Color = "bar"; 
+0

빈 클래스를 생성하면 BaseAppObject 인수 만받는 생성자를 만드는 것이 더 좋을 것이라고 생각합니다. –

+0

위 코드는 래핑 클래스가 _baseObject에 액세스하는 데 필요한 기본 클래스의 public 속성을 생략했습니다. –

+0

응? Node 생성자는 의미가 없습니다. "BaseAppObject baseObject"인수를 가져 와서 this.BaseObject 속성을 this로 설정할 수 없습니다. this.BaseObject는 BaseAppObject 속성이 아닌 string 속성입니다. –

1

. 당신이 노드BaseClassObj의 하위 클래스를 만들고 싶어하지 않는 이유는

public abstract class BaseWrapper<TBaseType> 
    where TBaseType : class 
{ 
    protected readonly TBaseType BaseItem; 

    protected BaseWrapper(TBaseType value) 
    { 
     BaseItem = value; 
    } 

    public bool IsNotNull() 
    { 
     return BaseItem != null; 
    } 
} 
+0

그건 나쁜 생각이 아니야. 항상 동일한 유형의 객체를 래핑 할 것이라는 것을 알고 있기 때문에 실제로 제 경우에는 적용되지 않습니다. –

0

표시되지 않습니다. 래퍼 클래스를 작성하는 경우에는 유형 캐스팅 기능을 사용하여 "Node"클래스를 만들 수 있으며 모든 자식 클래스가 BaseClassObj와 직접 호환됩니다.

당신이 그 일을하는 경우, 당신은 단지

public abstract class Node : BaseAppObject 
{ 

    public Node(string name) : base() 
    {    
     this.Name = name; 
    } 

    public string Name 
    { 
     get { 
       string name = ""; 
       this.GetUserString("CPName", ref name); 
       return name;    
      } 

     set { 
       this.SetUserString("CPName", value); 
      } 
    } 
} 

지금 당신은 단지 BaseClassObj 같은 노드 객체를 사용하고, 여전히 추가 기능을 사용할 수 있습니다 말할 수 있습니다. 나는 이것이 래퍼 클래스를 구현하는 더 좋은 방법이라고 생각한다. C#의 typecasting은 환상적이므로 이점을 활용해야합니다.

+0

좋아,하지만이 버전의 Node로 BaseAppObject의 기존 인스턴스를 래핑하는 방법은 무엇입니까? BassAppObject의 인스턴스를 만들 수는 없지만 사용자가 선택하면 BassAppObject에 대한 참조가 생성됩니다. –