문제

아래 코드는로 구성됩니다 두 수업:

  • SmartForm (간단한 모델 클래스)
  • SmartForms (모음을 포함하는 복수 수업 SmartForm 사물)

나는 단수와 복수 수업을 인스턴스화 할 수 있기를 원합니다. 이와 같이 (즉, 공장 메소드 getSmartform ())을 원하지 않습니다.

SmartForms smartForms = new SmartForms("all");
SmartForm smartForm = new SmartForm("id = 34");

논리를 통합하기 위해 복수 클래스 만 데이터베이스에 액세스해야합니다. 단일 클래스는 스스로를 인스턴스화하도록 요청할 때 단순히 복수 클래스를 인스턴스화 한 다음 복수 객체의 컬렉션에서 하나의 객체를 골라 내고. 그 대상이 되십시오.

어떻게해야하나요? 나는 개체를 할당하려고했다 this 작동하지 않습니다.

using System.Collections.Generic;

namespace TestFactory234
{
    public class Program
    {
        static void Main(string[] args)
        {
            SmartForms smartForms = new SmartForms("all");
            SmartForm smartForm = new SmartForm("id = 34");
        }
    }

    public class SmartForm
    {
        private string _loadCode;

        public string IdCode { get; set; }
        public string Title { get; set; }

        public SmartForm() {}

        public SmartForm(string loadCode)
        {
            _loadCode = loadCode;
            SmartForms smartForms = new SmartForms(_loadCode);
            //this = smartForms.Collection[0]; //PSEUDO-CODE
        }

    }

    public class SmartForms
    {
        private string _loadCode;

        public List<SmartForm> _collection = new List<SmartForm>();
        public List<SmartForm> Collection
        {
            get
            {
                return _collection;
            }
        }

        public SmartForms(string loadCode)
        {
            _loadCode = loadCode;
            Load();
        }

        //fills internal collection from data source, based on "load code"
        private void Load()
        {
            switch (_loadCode)
            {
                case "all":
                    SmartForm smartFormA = new SmartForm { IdCode = "customerMain", Title = "Customer Main" };
                    SmartForm smartFormB = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                    SmartForm smartFormC = new SmartForm { IdCode = "customerMain3", Title = "Customer Main3" };
                    _collection.Add(smartFormA);
                    _collection.Add(smartFormB);
                    _collection.Add(smartFormC);
                    break;
                case "id = 34":
                    SmartForm smartForm2 = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                    _collection.Add(smartForm2);
                    break;
                default:
                    break;
            }
        }
    }
}
도움이 되었습니까?

해결책

그것은 똑같은 객체 일 필요는 없으며 외부 관찰자와 동일하게 보일 것입니다. 한 객체에서 다른 객체에서 모든 데이터를 복사하면 동일한 작업을 수행합니다.

public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    this.IdCode = smartForms[0].IdCode;
    this.Title = smartForms[0].Title;
}

다른 팁

하나의 물체가 다른 개체를 "지는"것을 얻을 수는 없습니다.

생성자 대신 정적 메소드를 사용하고 (정적 메소드 만 액세스 할 수 있도록 생성자에게 개인/내부/무엇이든지 만듭니다). 생성자보다 정적 메소드를 사용하는 데는 여러 가지 이점이 있습니다.

  • 적절한 경우 null을 반환 할 수 있습니다
  • 적절한 경우 기존 객체를 반환 할 수 있습니다
  • 당신은 많은 일을 할 수 있습니다 그 다음에 필드를 설정하는 간단한 생성자를 호출하십시오

단점은 C# Collection/Object Initializers에서 작동하지 않는다는 것입니다.

정적 방법에 대한 대안 (종속성 주입과 잘 어울리지 않음)은 별도의 공장을 갖고 인스턴스 방법을 호출하는 것입니다.

당신은 할 수 없습니다. Microsoft는 대신 공개 static create () 메소드를 정의하여이를 수행합니다. 예를 들어 System.net 네임 스페이스의 WebRequest 및 Httpwebrequest를 참조하십시오. 나는 당신도 똑같이 할 것을 제안합니다.

기본 클래스의 생성자를 내부 또는 비공개로 만들므로 직접 인스턴스화 할 수 없습니다. 또는 더 나은 아직, 그것을 추상적 인 수업으로 만드십시오. Create () 구현에서 숨겨진 생성자를 사용하십시오.

당신은 사용할 수 있습니다 internal 또는 protected 대신 생성자에 대한 수정 자 public. 그러한 :

public SmartForm() {}
public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    //this = smartForms.Collection[0]; //PSEUDO-CODE
}

:

internal SmartForm() {}
internal SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    //this = smartForms.Collection[0]; //PSEUDO-CODE
}

당신은 개인 클래스를 불렀습니다 SmartFormData, 모든 값을 넣습니다.

만들기 SmartForms 복수 클래스는 그 대상의 모음을 유지하고 SmartForm 단일 생성자 오른쪽 SmartFormData 인스턴스를 찾으십시오 SmartForms 복수형.

그런 다음 모든 속성을 만듭니다 SmartForm 단일 가치는 그들의 가치를 가져옵니다 SmartFormData

그러나이를 수행하는 가장 좋은 방법은 개인 생성자를 갖고 공장 방법을 사용하는 것입니다.

생성자를 사용해야하는 이유가 있습니까?

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