在基类中,有没有办法提供适用于所有继承类的隐式转换?
以下是我正在使用的类的简化示例:
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
中的名称和特定格式说明符。看起来我应该能够将隐式运算符放入所有这些类继承的基类中。那可能吗?问题是在基类中,我必须返回正确子类的实例,我不知道这是否可行,或者是否可取。
或者有更好的方法来构建这些类吗?
P.S。请参阅my follow-up question我要求批评可能的方法来完成我的要求。 (在问这个问题后我才想到这一点。)
答案 0 :(得分:1)
假设我有一个带有以下签名的方法:ConsumeDate1(Date1 date)
。如果您提供如您所述的“魔法转换”,我应该能够将字符串传递给方法(ConsumeDate1("1507")
),应该进行隐式转换,并将结果提供给方法实现。转换的唯一信息是输入是字符串,输出应该是Date1 或派生类。转换怎么会知道选择哪个类?它唯一知道的是Date1
。即使您能够在Date2
和Date3
中重新定义转化,转化操作也无法神奇地决定转换为哪种实现。
在这种情况下,遗传不幸没有帮助。例如,您可以在每个派生类上提供静态工厂方法(Parse
,FromString
...)。
这些问题显然是你必须明确选择使用哪种类型 - ConsumeDate1(Date3.Parse("1507"))
,但我们已经确定转换无法解决这个问题并且无论如何都需要帮助。
另一个问题是你不能通过C#的类型系统对所有派生类强制执行那些静态方法。如果你想确保它们被实现(至少在你拥有的代码中),你可以使用Convetion Testing并反过来检查Date1
的所有子类是否包含这样的静态方法。