生成引用自己的类

时间:2009-07-23 16:31:14

标签: c# generics

有没有办法对这两个类进行一致化?

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

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

所以我会:

class Tag1 : Tag{}

class Tag2 : Tag{}

似乎没有,但可能我错过了一些全球性的东西。

感谢Jon,我结束了以下解决方案:

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

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

5 个答案:

答案 0 :(得分: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 T = (the same type deriving from SelfRef<T>)下执行层次结构时,您始终无法实现,但请不要打扰:)

您可能会让子工厂接受新的父级。基本上你真正想要的类型关系 - {{1}} - 无法在.NET泛型中表达,这就是为什么你会有轻微的混乱。

答案 1 :(得分: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;}
}

但我目前无法检查其有效性。

答案 2 :(得分:0)

怎么样:

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

答案 3 :(得分: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();
    }
  }

答案 4 :(得分:0)

我认为这是你正在寻找的,虽然我不确定我是否理解这个问题,而且自从你提出问题以来已经很长时间了。

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