【问题标题】:Can a abstract generic parent class automatically get child (extending) type?抽象泛型父类可以自动获取子(扩展)类型吗?
【发布时间】:2011-12-09 13:26:16
【问题描述】:

在我的 c# 项目中,我有两个抽象的通用父类,然后有多个继承它们的子类。问题是我将子类型传递给父泛型,并且它使一些看起来很愚蠢的类和方法定义。

在通用父类中是否有办法获取继承它们的类的类型?因此,不必在 DTOBase 中传递类型,而是将其声明为 DTOBase 的第一个子项的类型。

父类定义

public abstract class DTOBase<T> : INotifyPropertyChanged, IMergeable<T>

public abstract class ModelBase<T,U> : INotifyPropertyChanged, ITrackable, IMergeable<U> 
    where T : DTOBase<T>
    where U : ModelBase<T,U>

示例子类

 public class MenuGroup : DTOBase<MenuGroup>

public class MenuGroup : ModelBase<DTOs.MenuGroup, MenuGroup>

【问题讨论】:

  • 为什么需要继承类的类型?
  • 在第一个例子中,DTOBase,我需要IMergeable接口定义的继承类的类型。

标签: c# class generics inheritance


【解决方案1】:

不,当您有一种无法以其他方式轻松表达的类型关系时,这种事情相当普遍。我的协议缓冲区端口中有类似的东西:

public interface IMessage<TMessage, TBuilder> 
    : IMessage<TMessage>, IMessageLite<TMessage, TBuilder>
    where TMessage : IMessage<TMessage, TBuilder>
    where TBuilder : IBuilder<TMessage, TBuilder>

它既烦人又丑陋,但它可以完成工作。很抱歉没有更好的消息告诉你。

【讨论】:

  • 该死。这令人沮丧,因为我认为编译器应该能够在编译时找出这些类型关系,而无需明确通知它。
  • @MalcolmO'Hare:这不是 编译器 的问题 - 是类型系统不够丰富,无法表达这种关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多