[英]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);
}
}
我计划把Date2
和Date3
类,它们唯一的区别从Date1
的名称,并在特定的格式说明SerializeTo
。 看来我应该能够将隐式运算符放到所有这些类都继承自的基类中。 那可能吗? 问题在于,在基类中,我必须返回正确子类的实例,而且我不知道这是否可能或明智。
还是有更好的方法来构造这些类?
附言:请参阅我的后续问题 ,在这里我要求对完成我所要求的方法的批评。 (我问这个问题后才想到这一点。)
@DavidArno在评论中已经提到了为什么在技术上不可能做到这一点,但让我们暂时忘记这一点,并考虑一个您要实现的目标的示例。
假设我有一个带有以下签名的方法: ConsumeDate1(Date1 date)
。 如果您提供了您所描述的“神奇转换”,我应该能够将字符串传递给方法( ConsumeDate1("1507")
),应该进行隐式转换,并将结果提供给方法实现。 转换具有的唯一信息是输入是字符串,并且输出应为Date1 或派生类 。 转换如何知道选择哪个班级? 它唯一知道的是Date1
。 即使您能够在Date2
和Date3
重新定义转换,转换操作也无法神奇地确定要转换为哪个实现。
在这种情况下,不幸的是继承没有帮助。 例如,您可以在每个派生类上提供静态工厂方法( Parse
, FromString
...)。
这些问题显然是,您必须显式选择要使用的类型ConsumeDate1(Date3.Parse("1507"))
,但是我们已经确定转换无法确定其本身,并且仍然需要帮助。
另一个问题是,您不能通过C#的类型系统在所有派生类上强制使用这些静态方法。 如果要确保实现它们(至少在您拥有的代码中),则可以使用对流测试并反思地检查Date1
所有子类Date1
包含此类静态方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.