【问题标题】:return subtype of baseclass in C#?在 C# 中返回基类的子类型?
【发布时间】:2014-03-18 00:26:16
【问题描述】:

我有一个类层次结构,我希望每个类都返回自己的类型,而不是基类的类型

我知道我必须在基类中使用泛型

abstract class Base<T> where T : Base<T>
{
    public T Foo() { ... }
}

class Sub : Base<Sub> { ... }
new Sub().Foo(); //returns Sub

现在我的问题是如果我想从派生类继承该怎么办

class SubSub : Sub { ... }
new SubSub().Foo(); //returns Sub and not SubSub 

我可以让子类也通用

abstract class Sub<T> : Base<Sub<T>> where T : Sub<T> { ... }
abstract class SubSub<T> : Sub<SubSub<T>> where T : Sub<SubSub<T>> { ... }

但现在我必须为每个继承创建 2 个类。 1 个抽象的泛型类是实际的类,而 1 个类只是搭上了抽象和泛型

abstract class _Sub<T> : Base<_Sub<T>> where T : _Sub<T> { ... }
class Sub : _Sub<Sub> { ... }

abstract class _SubSub<T> : _Sub<_SubSub<T>> where T : _SubSub<T> { ... }
class SubSub : _SubSub<SubSub> { ... }

这会做我想要的,但我不认为这是一个干净的解决方案

我必须使用 2 个类才能创建新实例

class Sub<T> : Base<Sub<T>> where T : Sub<T> { ... }
var a = new Sub</* -- I think there is no valid option that could go here -- */>();

有没有一种干净/最佳实践的方式来做我想做的事?还是我的方式已经干净了,我只是觉得它很丑?

【问题讨论】:

  • 您的意思是要返回 Base 而不是 Sub,或者特别是 SubSub。返回 Base 就足够了,因为所有实现都可以通过覆盖来处理。 (然后 Foo 应该简单地返回 Base 而不是 T )
  • 你为什么还要关心?对于返回精确类型引用的方法来说,什么如此重要?如果您关心开销,我可以向您保证,为您使用的每个特定类型创建一个泛型类型将比简单的强制转换重要得多。你继承遗产并把好东西扔掉是因为……为什么?
  • 抽象类 Base&lt;T&gt; where T: Base&lt;T&gt; 会编译吗?

标签: c# .net generics inheritance


【解决方案1】:

我认为这与您正在寻找的内容非常接近:

abstract class Base<T> where T : Base<T>
{
    public T Foo()
    {
        return default(T);
    }
}

class Sub<T> :Base<T> where T : Base<T>
{

}

class SubSub : Sub<SubSub> 
{

}

现在您可以通过这种方式创建 SubSub:

var subSub = new SubSub();
SubSub subSubResult = subSub.Foo();

但是现在很难创建一个子......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2012-03-03
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2019-10-29
    相关资源
    最近更新 更多