在一个抽象的基类中向下倾斜,有什么办法可以强迫它吗?

时间:2015-02-11 17:59:47

标签: c# generics inheritance c#-3.0 downcast

当在那里实际知道派生类型时(由于复杂的泛型),有没有强制在抽象基类中进行向下转换?

现在我的丑陋的解决方法是实现一个抽象的受保护的属性这只是简单地返回...所以通常的关于向下转换的东西是不可能的,因为"缺少额外的部分"不适用,所有部件都在那里,我只需要强制类型系统让我有些松懈:/

protected abstract T This { get; }

知道派生类型,我无法找到任何方法强制演员阵容发生! 有什么办法吗?

(这是框架的一部分,因此迫使消费者实现像This-property这样的愚蠢的东西真的很糟糕。我宁愿让内部工作更复杂,并迫使消费者尽可能少地编写代码。)< / p>

修改 由于很难看出这会有什么用处,我会尝试添加更多代码。它或许看起来仍然很奇怪,如果需要,我会尝试再添加更多。

基本上在这个特定问题的部分代码中,它以这种方式涉及两个方法(省略了实际的实现细节,只是一个例子)

abstract class Base<DerivedType, OtherType>
    where .... //Complicated constraints omitted
{
    protected abstract OtherType Factory(DerivedType d);

    public bool TryCreate(out OtherType o)
    {
        //Omitted some dependency on fields that reside in the base and other stuff
        //if success...
        o = Factory((DerivedType)this); //<-- what I can not do
        return true;
    }
}

(至于更大的图片,它是你可以用xpath做的一些强类型替代方案的一部分,在Linq2Xml之上工作。)

1 个答案:

答案 0 :(得分:2)

以下类定义编译。我不知道你省略的约束是否与此相冲突。

public abstract class Base<DerivedType, OtherType> 
      where DerivedType : Base<DerivedType, OtherType>
{
    protected abstract OtherType Factory(DerivedType d);

    public bool TryCreate(out OtherType o)
    {
       o = Factory ((DerivedType)this);
       return true;
    }
 }

public  class MyClass : Base<MyClass, string>
{
   protected override string Factory (MyClass d)
   {
      return d.GetType ().Name;
   }
}