2009-07-23 10 views
1

この2つのクラスをどのように生成する方法はありますか?自分自身を参照するクラスを生成する

class Tag1{ 
    public Tag1 Parent{get;set;} 
} 

class Tag2{ 
    public Tag2 Parent{get;set;} 
} 

だから私は持っています:

class Tag1 : Tag{} 

class Tag2 : Tag{} 

を私はグローバルな何かを見逃している可能性がないようだが、。ジョンへ

おかげで、私は以下のソリューションで終了:

class Tag1 : Tag<T> { 
    public T Parent {get;set;} 

    public T AddNew(){ 
     return new T(){Parent = (T)this;} // This works 
    } 
} 
+1

generificate? :) – Sev

+0

「generificate」の定義、またはスペルチェッカーを介したクイック実行が必要です。私はどんな種類の回答を提供することもできません。 – jrista

+0

heh ...新しい用語を作っています。 – Randolpho

答えて

5

少し前よりメシエ、オーケー、およびサブクラスは、もう少し作業を行う必要がありますが、...

public abstract class SelfRef<T> where T : SelfRef<T> 
{ 
    private readonly Func<T> childFactory; 

    public T Parent { get; set; } 

    protected SelfRef(Func<T> childFactory) 
    { 
     this.childFactory = childFactory; 
    } 

    public T AddNew() 
    { 
     return childFactory(); 
    } 
} 

public sealed class Ref1 : SelfRef<Ref1> 
{ 
    public Ref1() 
     : base(() => new Ref1 { Parent = this }) 
    {    
    } 
} 

私はそれが要件を満たしていると思います。 SelfRefでは1階層以上の階層を実装するのに問題はありますが、気にしないでください。

潜在的に子ファクトリを新しい親にすることができます。基本的にあなたが本当に必要とするタイプの関係 - つまりT = (the same type deriving from SelfRef<T>) - は.NETのジェネリックでは表現できません。そのため、あなたはちょっと混乱しています。ここで

+0

自己参照でそれをどのようにインスタンス化しますか? First 、Second <...>>、Second >>>? – jrista

+0

サブクラスを使用します。 –

+0

jristaインスタンス化は必要ありませんが、このソリューションの問題点は、タグ付きが同じタイプのインスタンスを作成できないことです。私はこのrequirmentをquesttionに追加するのを忘れていました。 –

0

ふむ...私の最初に考えたのは、このでした:

public class ParentizedClass<T> 
{ 
    public T Parent {get; set;} 
} 

しかし、私は思った...「いや、その働くことはできません。

私はそれが可能であるとは思わない。

うーん...もう少しそれに取り組んで、あなたがインターフェイスを使用できます。

public interface ParentizedClass<T> 
{ 
    public T Parent {get; set;} 
} 

をし、クラスが基底クラスとしての地位を使用して、インターフェイスを実装します:

public class MyClass : ParentizedClass<MyClass> 
{ 
    public MyClass Parent {get; set;} 
} 

しかし、私は現時点で有効性を確認することはできません。

+0

もちろん、それはできます - なぜそれはできませんでしたか? –

+0

そのインスタンスを宣言することはできません。 var obj = new ParentizedClass >>(); – Randolpho

+0

親が元のクラスと同じ型ではないためです。親の型はT型であり、元のクラスの型はParentizedClass です。彼は、私が正しく理解しているなら、元のクラスと同じタイプの親を望んでいます。 – Alex319

0

方法について:

class Tag<T> 
{ 
    public Tag<T> Parent{get; set;} 
} 

0

がいい毛深い例です。

class Pair<TCar, TCdr> 
    { 
    public TCar Car { get; set; } 
    public TCdr Cdr { get; set; } 
    } 

    class List<T> : Pair<T, List<T>>, IEnumerable<T> 
    { 
    public List(T car, List<T> cdr) 
    { 
     Car = car; 
     Cdr = cdr; 
    } 

    IEnumerator<T> IEnumerable<T>.GetEnumerator() 
    { 
     yield return Car; 
     var cdr = Cdr; 
     while (cdr != null) 
     { 
     yield return cdr.Car; 
     cdr = cdr.Cdr; 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return ((IEnumerable<T>)this).GetEnumerator(); 
    } 
    } 
0

私は質問を理解していないものの、これはあなたが探しているものだと思うし、あなたがそれを求めているので、長い時間がかかりました。

class Child<T> where T : Child<T> { public T Parent { get; set; } } 
class Tag : Child<Tag> { } 
class Tag1 : Tag { } 
class Tag2 : Tag { } 
関連する問題