使用したいこの単純なクローン インターフェイスがあります。コンパイルする必要があるように見えますが、そうではありません。BObject
クラスが を実装していないというメッセージが表示されDeepClone()
ます。DeepClone()
メソッドがあり、BObject
クラスが を実装 しているため、これがわかりませんIObject
。
interface IDeepCloneable<T>
{
T DeepClone();
}
interface IObject : IDeepCloneable<IObject>
{
string Name { get; }
double Sales { get; }
}
//'BObject' does not implement interface member
// 'IDeepCloneable<IObject>.DeepClone()'
class BObject : IObject
{
public string Name { get; set; }
public double Sales { get; set; }
public BObject DeepClone()
{
return new BObject() { Name = this.Name, Sales = this.Sales };
}
}
インターフェイスを間違って宣言していますか?
それともDeepClone
実装?このコードを使用できます:
public IObject DeepClone() //returns an IObject instead of a BObject
{
return new BObject() { Name = this.Name, Sales = this.Sales };
}
BObject.DeepClone()
私が抱えている問題は、メソッドが結果として a を返すことを確認していないBObject
ことです。次のようなクラスを作成できます。
class BObjectImposter : IObject
{
public string Name { get; set; }
public double Sales { get; set; }
public IObject DeepClone()
{
//returns a BObject instead of a BObjectImposter
return new BObject() { Name = this.Name, Sales = this.Sales };
}
}
このクラスを使用すると、次のように記述できます。
BObjectImposter objImp = new BObjectImposter();
IObject copy = objImp.DeepClone();
copy
これは の実装だと思うかもしれませんがBObjectImposter
、実際にはBObject
も実装している無関係なクラスの実装IObject
です。インターフェースの要点は、使用する実装は問題にならないということだと理解していますが、これは私には良いコードのようには思えません。おそらく私の実装のどこかで、オブジェクトを返すことBObjectImposter
を期待しています。また、IObject の 1 つの実装は、IObject の別の実装に依存するべきではありません。DeepClone()
BObjectImposter
たぶんIObject
、抽象クラスを作成しDeepClone()
てそこで宣言できます。ObjectA
これは、コンストラクターで設定する前に設定する必要がある実装 ( と呼ぶ) と、コンストラクターでName
設定する前に設定する必要がSales
ある別の実装 ( と呼ぶObjectB
) がある場合、設計が壊れる可能性があるようです。Sales
Name