有没有办法对这两个类进行一致化?
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
}
}
答案 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 { }