1

設計上の質問です。ビジネス オブジェクトと、そこから派生した 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>();
        }


    }
4

3 に答える 3

3

メンバーがプライベート (または保護) であり、それ以外の場合はクラス API で公開されていないと仮定すると、BindingListおそらく次のようなものが必要になるでしょう。

  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> { ... }
  ...
于 2009-07-25T00:12:57.823 に答える
1

この例は、.net 3.5 以降でのみ機能します。:(

おそらく、継承されたすべてのオブジェクトを返すプロパティです。同様の質問があり、System.Linq を使用していました。これが私が使用したものです:

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

または、それらすべてを親にキャストします。

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

上記のコードはこの回答からのものです。ありがとうマット。

于 2009-07-25T00:25:37.530 に答える
0

子の間に継承関係がある場合は、BindingList<TheBaseClass>メインのコレクション型として使用してみませんか?

共分散を使用する必要がある場合の最も顕著な例は、 をBindingList<TheDerivedClass>として扱いたい場合ですBindingList<TheBaseClass>。これがあなたをつまずかせている具体的な例を挙げていただけますか? 共ビアランスが回答であるシナリオの多くは、ジェネリック、制約、および場合によっては追加のインターフェイスを組み合わせて解決することもできます。

于 2009-07-25T00:09:57.030 に答える