この問題を解決するデザインパターンがあるかどうかは疑問です。子プロパティを含む子クラスのデザインパターン
public abstract class DBAccess
{
protected MetaData MetaData;
}
public class OldDBAccess: DBAccess
{
//this class will set metatData = new OldDBMetaData(); in the constructor
}
public class NewDBAccess: DBAccess
{
//this class will set metaData = new NewMetaData(); in the constructor
}
public abstract class MetaData
{
//some variables and methods that belong to all MetaData objects
}
public class OldMetaData : MetaData
{
string oldName;
//some variables and methods that belong to only OldDBMetaData objects
}
public class NewMetaData : MetaData
{
//some variables and methods that belong to only NewDBMetaData
}
私はOldDBMetaDataに属しているプロパティを設定しますOldDBAcessでメソッドを呼び出すことができるようにしたい: 私はこのようになります構造を有しています。メタデータはメタデータオブジェクトではなくOldDBMetaDataオブジェクトなので、私はこれまでのところ、これを行うために持っていた:
//method in OldDBAccess
public void SetOldName(string name)
{
if(metaData is OldMetaData)
{
OldMetaData metaData = (OldMetaData)MetaData;
if (metaData == null)
// metaData isn't of type OldMetaData
else
metaData.oldName = name;
}
}
これはうまく動作しますが、私はちょうどメタデータがタイプでOldMetaDataであることを確認する必要がありますする必要はありません私がメソッドを呼び出すたびに。私はそれがコンストラクタでこの型に設定されているので、この型のことを知っています。派生クラスまたは基本クラスのいずれかでmetaDataプロパティを使用したいので、それぞれのDBAccessクラスにプロパティを作成するだけではありません。このような構造でこれを行うためのデザインパターンや簡単な方法はありますか?
あなたの質問には欠けている部分があると思います。たとえば、OldDBMetaDataがOldDBAccessのコンストラクタでnew'dであるとします。次に、OldDBAccessのメソッドであるSetOldNameというメソッドを提供します。したがって、OldDBAccessは構築してから型を正確に認識しています。また、サンプルメソッドでは、クラス名が変更されています(AccountMetaDataはMetaDataと同じですか?OldDBMetaDataはOldMetaDataと同じですか?)。 –
廃止されたプロパティとメソッド( 'OldMetaData'ではなく、' NewMetaData'ではないもの)をno-opsにするようにしますか? – FMM
@ TrevorAsh、そうです、私は一貫性のないいくつかのメソッドクラス名を持っていました。私は今彼らを固定してより意味をなさせるべきです。 – stacy