0

実験からのデータ収集を自動化するソフトウェアを作成していて、ビジネス オブジェクト間の関係を表現するための助けが必要でした。

と呼ばれるExperiment型、 と呼ばれる型、および型の派生物を受け入れてデータを入力する必要がSampleある未実装のRunOnSampleメソッドがあります。ExperimentSample

Public MustInherit Class Experiment
    Public Property TestDate As Date
    Public Property Experimenter As String

    Public MustOverride Sub RunOnSample(sample As Sample)
End Class

Public MustInherit Class Sample
    Public Property UnitLotCode As String
End Class

Experimentさまざまな種類のデータを生成するさまざまな実験 ( のサブタイプで表される) があるため、これらの型はどちらも実際にはインスタンス化できません。Sample各実験には、実験によって生成されたデータを格納するためのプロパティを持つ、一致するサブタイプがあります。すべての実験に共通するいくつかのプロパティと、すべてのサンプルに対して記録されるいくつかのデータがあるため、基本クラスが必要であることに注意してください。

たとえば、 はThicknessExperiment厚さデータを測定し、ロット コードをスキャンして、このデータを に入力しますThicknessSample

Public Class ThicknessExperiment
    Public Overrides Sub RunOnSample(sample As ThicknessSample)
        Dim data = GetDataFromMeasurementDevice()

        sample.UnitLotCode = data.LotCode
        sample.Thickness = data.Thickness
    End Sub
End Class

Public MustInherit Class ThicknessSample
    Public Property Thickness As Single
End Class

ここでの問題は、パラメーターの型がコンパイラーに受け入れられないことです。の実装はRunOnSampleを受け入れる必要がありSampleThicknessSample(または の他のサブタイプSample) は受け入れません。おそらくこれは、コンパイラが私のやり方を許してくれていれば、派生した実験は親クラスと同じインターフェースを持たなくなり、ポリモーフィックでなくなるからです。

この問題に対処するために私が考えることができる唯一の方法はSample、メソッドを使用する前に、引数をメソッド内の適切なサブタイプにキャストすることです。私がしようとしていることを実装するためのより良い方法はありますか? XYZExperiment.RunOnSampleメソッドとXYZSample引数の強く型付けされた関連付けを維持するアプローチが望ましいですか?

4

1 に答える 1

1

まず第一に、個人的な好みとして、そして少しの経験から、コードの再利用や共通のプロパティに継承を使用するのではなく、ポリモーフィズムの恩恵を受けるためだけに継承を使用することを学んだので、それらの共通のデータ プロパティを新しいクラスを作成し、さまざまなプロパティのディクショナリを使用してから、委任(構成)を使用して特定のサンプルのデータを保存します。とにかく、私が提案する解決策にはジェネリックの使用が含まれているため、次のようなことができます。

public abstract class Experiment<TSample>
            where TSample : Sample
        {
            private DateTime experimentDate;
            private string Experimenter;

            public abstract void RunOnSample(TSample sample);
        }

        public class ThicknessExperiment : Experiment<ThicknessSample>
        {

            public override void RunOnSample(ThicknessSample sample)
            {
                // sample.lotcode = "43";
                // sample.data1 = "343";
                // sample.data2 = "43";

            }
        }

        public abstract class Sample
        {
            public string lotcode;

        }

        public class ThicknessSample : Sample
        {
            public string data1;
            public string data2;
        }
于 2013-07-10T23:56:58.197 に答える