2016-10-03 20 views
-2

ICloneable.Clone()を抽象基本クラスに実装しようとしているので、サブクラスで気にする必要はありません。 そのクラスの基本的な責任は、クローンに渡すべき内部のGuidプロパティを持つことです。つまり、 "プロパティクローン"に似ています。これにより、リポジトリから取得したアイテムを複製し、元のアイテムを変更せずにそのプロパティを変更し、その後Idで認識できるように変更されたインスタンスをリポジトリにサブミットすることができます。抽象基本クラスにカスタムICloneable実装を実装する

私の現在の実装は問題に直面しています:クラスが抽象であるため、IDを渡すインスタンスを作成できません!

public abstract class RepoItem : ICloneable, IEquatable<RepoItem> 
{ 
    protected RepoItem() 
    { 
     Id = Guid.NewGuid(); 
    } 

    private RepoItem(Guid id) 
    { 
     Id = id; 
    } 

    public Guid Id { get; private set; } 

    public object Clone() 
    { 
     return new RepoItem(Id); // cannot create instance of abstract class 
    } 

    public bool Equals(RepoItem other) 
    { 
     return other.Id == Id; 
    } 
} 

この問題を解決する方法はありますか?これはまずまずのデザインですか?既にコメントで説明し

+2

とにかくタイプが間違っています。そして、問題は、あなたが正しいタイプが基本クラスにあるべきであるかどうか分かりません。実際のランタイムタイプのインスタンスを作成する必要があります。派生したクラスを実装する抽象メソッドを使用します。 – Luaan

+1

子クラスが自分自身をクローンする方法を知っているクラスなので、 'Clone'抽象を作成することもできます。 – juharr

+0

@Luaanリフレクションベースのアプローチではどうなると思いますか? – heltonbiker

答えて

3

このインターフェイスはすべてに実装するべきではありません。そのため、実装がベースクラスになるか、またはポイントのすぐ近くにあるものであれ、単に最初にそこに行かないでください。詳細については、

Why should I implement ICloneable in c#?

このインタフェースは、2003年を参照してください以降廃止されました。

+0

これは十分自信があると思う; o)ありがとう!! – heltonbiker

0

として、あなたはそれを行うことができない...

行うための最善のことは、1が明示的に持っているものの、そのクローニングは、すべての派生クラスのために利用可能であることを確認する(Cloneに抽象メソッドを作るために、おそらくです派生のレベルが1つ以上で、1つ以上のレベルがインスタンス化可能なclassを持つ場合は、Cloneを上書きします。その後

、コピーコンストラクタのようなものを持つことは行く方法のようになります。

class RepoItem : ICloneable 
{ 
    public abstract void Clone(); 
    protected RepoItem(RepoItem other) { Id = other.Id; } 
} 

class Derived1 : RepoItem 
{ 
    protected Derived1(Derived1 other) : base(other) 
    { 
     myField1 = other.myField1; 
    } 
    public virtual object Clone() { return new Derived1(this); } 

    private int myField1; 
} 

class Derived2 : Derived1 
{ 
    protected Derived2(Derived2 other) : base(other) 
    { 
     myField2 = other.myField2; 
    } 
    public override object Clone() { return new Derived2(this); } 

    private int myField2; 
} 

私はめったにこのようなコードを書かないように私はvirtualoverride権利を得たかはわかりません。

関連する問題