【发布时间】:2012-06-21 14:46:12
【问题描述】:
我在代码中传递和使用了两种不同类型的字符串,两者密切相关,但不应相互混淆。我认为我可以通过拥有两个只是字符串但名称不同的类来帮助自己避免错误,以便方法签名(以及一般的类型不兼容)将强制执行两种不同类型字符串的语义含义。同时,我不想在一百个地方从something = "foo";重构为something.Value = "foo";。
第一个想法:
private class FirstKind : string { }
private class SecondKind : string { }
如果我有这个想法
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
,然后尝试使用MyMethod(secondKindVar, firstKindVar); 调用它,我会得到一个编译器错误。
我击中的墙:string 已密封。
第二个想法:创建通用的KindOf<T> 类,它只会使用隐式转换运算符接收和输出值。像这样:
private class KindOf<T>
{
public T Value { get; set; }
public KindOf() { Value = default(T); }
public KindOf(T val) { Value = val; }
public static implicit operator T(KindOf<T> kindOf) { return kindOf.Value; }
public static implicit operator KindOf<T>(T value) { return new KindOf<T>(value); }
}
这样我可以做这样的事情:
private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
我撞到了墙:KindOf<T> 类似乎没有继承:派生类型中既不存在构造函数也不存在运算符,这意味着我必须在派生类中重新实现整个基类。代码复制。呸。
所以我觉得我在这里缺少一些基本的东西,也许我已经离开了杂草。对我正在尝试做的事情有什么想法吗?
【问题讨论】:
-
也许你能澄清一下“两种不同的字符串”是什么意思?
-
在我的脑海中,您可能只需要在子类上实现隐式运算符和构造函数。是的,有点像代码复制,但至少它没有采用复杂的过程或在继承没有真正传达任何真实的情况下使用继承(从修辞上讲,无论如何,什么是“KindOf”并且确实如此意味着什么?)并且只是为了减少除了相似语法(但不同用途)之外没有任何共同点的类之间的代码重复
-
同意,这些类真的不应该在同一个继承层次结构中,特别是考虑到你不想想要用一个通用类型来引用它们,你想要它们保持独特。
-
@BryanCrosby 想象一下,对于字符串代码而不是整数或 Guid 的记录,您有唯一的 ID。并且您要确保不会意外地将 PersonId 字符串传递到需要 CompanyId 字符串的方法中。对我来说,那时这样的东西肯定很方便。
标签: c# .net generics inheritance defensive-programming