문제

디자인 질문입니다. 비즈니스 객체와 5 가지 비즈니스 객체 유형이 있습니다.

또한 BindingList를 회원으로 가진 수업도 갖게됩니다. 나는 5 개의 수업을 파생시킬 것입니다.

공분산이 여기서 작동하지 않기 때문에 코드 반복을 최소화하기 위해 설계를 어떻게 구성 하시겠습니까? 물론 Bindinglist를 척하고 DataTable과 함께 갈 수 있습니다.이 경우 문제가 제거됩니다.

그러나 모두가 Bindinglist에 대해 열광하기 때문에 여러분이 어떻게 접근 할 것인지보고 싶습니다.

솔루션 (Pavel Minaev의 답변에 따라) :

public class SampleBase
    {
        protected string m_seq;
        protected string m_id;
        protected string m_weight;
        protected string m_units;       

        public SampleBase(string seq, string id, string weight, string units)
        {
            Seq = seq;
            Id = id;
            Weight = weight;
            Units = units;
        }

        public SampleBase() { }

        public string Seq
        {
            get { return m_seq; }
            set { m_seq = value; }
        }

        public string Id
        {
            get { return m_id; }
            set { m_id = value; }
        }

        public string Weight
        {
            get { return m_weight; }
            set { m_weight = value; }
        }

        public string Units
        {
            get { return m_units; }
            set { m_units = value; }
        }

    }

    public class FwdSample : SampleBase
    {
        protected string m_std_id;

        public FwdSample() { }

        public FwdSample (string seq, string id, string weight, string units, string std_id ) : base(seq, id, weight, units)
        {
            StdId = std_id;
        }

        public string StdId 
        {
            get { return m_std_id; }
            set { m_std_id = value; }
        }
    }
    //End of Sample Classes





    public abstract class RunBase<T> where T : SampleBase , new()
    {
        protected BindingList<T> m_samples;



        public RunBase() {}

        public void Add(T sample)
        {
            m_samples.Add(sample);
        }

        public void Update(int index, T sample)
        {
            m_samples[index] = sample;
        }

        public void Delete(int index)
        {
            m_samples.RemoveAt(index);
        }



        public BindingList<T> Samples
        {
            get { return m_samples; }
        }
    }


    public class FwdRun : RunBase<FwdSample>
    {

        public FwdRun()
        {
            m_samples = new BindingList<FwdSample>();
        }


    }
도움이 되었습니까?

해결책

당신의 가정 BindingList 회원은 비공개 (또는 보호)이며, 클래스 API에 노출되지 않으므로 다음과 같은 것을 원할 것입니다.

  class Base
  {
      // No BindingList here. All members that don't need it should be here
      ...
  }

  class Base<TDerived> : Base where TDerived : Base<TDerived>
  {
       BindingList<TDerived> list = new BindingList<TDerived>();

       // All members that need BindingList should be here
  }

  class Derived1 : Base<Derived1> { ... }
  class Derived2 : Base<Derived2> { ... }
  ...

다른 팁

이 예제는 .NET 3.5 이상에서만 작동합니다. :(

아마도 상속 된 물체를 모두 반환하는 속성 일 것입니다. 비슷한 질문이 있었고 System.linq를 사용했습니다. 여기에 내가 사용한 내용은 다음과 같습니다.

List<A> testme = new List<B>().OfType<A>().ToList();

또는 그들 모두를 부모에게 캐스팅하십시오.

List<A> testme = new List<B>().Cast<A>().ToList();

위의 코드는 이 답변. 감사합니다 Matt.

아이들 사이에 상속 관계가있는 경우 사용하지 않겠습니까? BindingList<TheBaseClass> 메인 컬렉션 유형으로?

공분산을 사용해야 할 때의 가장 두드러진 예는 BindingList<TheDerivedClass> ~처럼 BindingList<TheBaseClass>. 이것이 당신을 넘어 뜨리는 곳의 구체적인 예를 알려줄 수 있습니까? 공동 코비아랜스가 Anaswer 인 많은 시나리오는 제네릭, 제약 조건 및 때로는 추가 인터페이스의 조합으로 해결 될 수 있습니다.

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