私は、多くの固定オブジェクト、一般的にはさまざまなタイプの辞書とリストを含む抽象クラスを持っています。 ReadDataとWriteDataの抽象メソッドが存在します。次に、この抽象クラスの2つの異なる実装を用意しています.1つは、「テキストレコード」標準に従ってデータを書き出し、もう1つは定義されたXMLスキーマに対してデータを書き込みます。汎用変換メソッドを持つ抽象クラスの異なる実装間の変換
したがって、2つの実装は、異なる読み書き方法を除いて同一です。私は今、何をしたいか
はフォーマット1のデータを読み込み、その後、フォーマット2としてそれを書くことで、私はそれぞれのクラスでは、このような.ToFormat2()
や.ToFormat1()
などのメソッドを書き込むことによって、非常に簡単にこれを行うには、おそらく.FromFormat2()
ことができ、完全性が必要な場合は.FromFormat1()
。しかし、これらのルーチンは本質的に同じであり、私はフォーマット3が必要になるときに(あまりにも遠くない)将来を考えており、それぞれに2つ以上の同一の「To」メソッドを有益に実装する必要はありませんクラス。それは時間の無駄です、デバッグ/変更するのが難しく、ちょうど良いことではありません。
私は抽象クラス内に汎用コンバータを記述しようとしています。次のコードは、私がこれまで行ってきたことの原則を示しています:
public abstract class Test
{
public string Type;
public Dictionary<string, string> Dic1;
public Dictionary<string, int> Dic2;
public abstract void Read(string fileName);
public abstract void Write(string fileName);
public T ConvertTo<T>() where T : Test
{
T x = new T();
if (x.Type.Equals(this.Type)) { return this; }
x.Dic1 = this.Dic1;
x.Dic2 = this.Dic2;
return x;
}
}
public class Format1 : Test
{
// Constructor
public Format1() { Type = "Format1"; Dic1 = new Dictionary<string, string>(); Dic2 = new Dictionary<string, int>(); }
// Concrete implementations of abstract Read and Write for "Format1"
public override void Read(string fileName) { /* do reading stuff */ }
public override void Write(string fileName) { /* do writing stuff */ }
}
public class Format2 : Test
{
// Constructor
public Format2() { Type = "Format2"; Dic1 = new Dictionary<string, string>(); Dic2 = new Dictionary<string, int>(); }
// Concrete implementations of abstract Read and Write for "Format2"
public override void Read(string fileName) { /* do reading stuff */ }
public override void Write(string fileName) { /* do writing stuff */ }
}
コンパイラはこれを好まないのです。 x
を新しいT
と宣言したときにエラーが発生しました。なぜなら、new()制約がなく、を返すことができないからです。Test.Test
をT
に暗黙にキャストできないためです。
私は間違っていますか?あなたはこの
public T ConvertTo<T>() where T : Test, new()
のようなあなたのConvertTo<T>
方法を変更する必要が
代わりに、これに対して継承を使用する代わりにオブジェクトのラッパーを作成することを検討します。クラスが本当にロード/セーブされているかを気にするべきではないと考えてください(単一責任の原則)。代わりにSave()メソッドとLoad()メソッドを持つITestPersistanceを作成した場合は、継承を乱用することなくここにすべてのロジックを含めることができます。つまり、他のコードを変更することなく、ITestPersistance(つまりFormat3TestPersistance)の新しい実装を追加することができます。これはITestFormatとITestPersistanceに拡張できます。 – Milney
@Milney。ええ、はい。あなたはそれを指摘しています。そこの遺産で少し失われた! – StuartR143