繁体   English   中英

提供基类隐式构造的实现

[英]Provide implementation for implicit construction in base class

在基类中,有没有一种方法可以提供适用于所有继承类的隐式转换?

这是我正在使用的类的简化示例:

public class Date1 {
   public Date1(DateTime value) {
       Value = value;
   }

   public DateTime Value { get; set; }

   public static implicit operator Date1(string value) {
      DateTime dt;
      DateTime.TryParse(value, out dt);
      return new Date1(dt);
   }

   public void SerializeTo(TextWriter textWriter)
   {
      textWriter.Write("{0:yyMM}", Value);
   }
}

我计划把Date2Date3类,它们唯一的区别从Date1的名称,并在特定的格式说明SerializeTo 看来我应该能够将隐式运算符放到所有这些类都继承自的基类中。 那可能吗? 问题在于,在基类中,我必须返回正确子类的实例,而且我不知道这是否可能或明智。

还是有更好的方法来构造这些类?

附言:请参阅我的后续问题 ,在这里我要求对完成我所要求的方法的批评。 (我问这个问题后才想到这一点。)

@DavidArno在评论中已经提到了为什么在技术上不可能做到这一点,但让我们暂时忘记这一点,并考虑一个您要实现的目标的示例。

假设我有一个带有以下签名的方法: ConsumeDate1(Date1 date) 如果您提供了您所描述的“神奇转换”,我应该能够将字符串传递给方法( ConsumeDate1("1507") ),应该进行隐式转换,并将结果提供给方法实现。 转换具有的唯一信息是输入是字符串,并且输出应为Date1 或派生类 转换如何知道选择哪个班级? 它唯一知道的是Date1 即使您能够在Date2Date3重新定义转换,转换操作也无法神奇地确定要转换为哪个实现。

在这种情况下,不幸的是继承没有帮助。 例如,您可以在每个派生类上提供静态工厂方法( ParseFromString ...)。

这些问题显然是,您必须显式选择要使用的类型ConsumeDate1(Date3.Parse("1507")) ,但是我们已经确定转换无法确定其本身,并且仍然需要帮助。

另一个问题是,您不能通过C#的类型系统在所有派生类上强制使用这些静态方法。 如果要确保实现它们(至少在您拥有的代码中),则可以使用对流测试并反思地检查Date1所有子类Date1包含此类静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM