为基类中的隐式构造提供实现
本文关键字:实现 基类 | 更新日期: 2023-09-27 18:02:47
在基类中是否有一种方法可以提供适用于所有继承类的隐式转换?
下面是我使用的一个类的简化示例:
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
的所有子类是否包含这样的静态方法。