如何声明派生的"shell"类除了充当重命名之外什么都不做?

Ata*_*rio 11 .net c# generics inheritance defensive-programming

我有两种不同的字符串,我在我的代码中传递和使用,两者密切相关,但不应相互混淆.我认为我可以通过让两个只是字符串的类来帮助自己避免错误,但是使用不同的名称以便方法签名(以及通常的类型不兼容)将强制执行两种不同类型字符串的语义含义.与此同时,我不想不得不从重构something = "foo";something.Value = "foo";中百地方.

首先想到:

private class FirstKind : string { }
private class SecondKind : string { }
Run Code Online (Sandbox Code Playgroud)

我的想法是,如果我有

void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
Run Code Online (Sandbox Code Playgroud)

,然后尝试调用它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); }
}
Run Code Online (Sandbox Code Playgroud)

这样我可以这样做:

private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
Run Code Online (Sandbox Code Playgroud)

我遇到了Wall:KindOf<T>类中没有任何东西似乎继承:派生类型中既没有构造函数也没有运算符,这意味着我必须在派生类中重新实现基本上整个基类.代码复制.呸.

所以我觉得我在这里缺少一些基本的东西,也许我在杂草中.对于我正在尝试做什么的任何想法?

Dan*_*ite 0

我只会对字符串执行此操作。

abstract class MyTypedString
{
   protected MyTypedString(string value)
   {
     Value = value;
   }
   public string Value { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

FirstKind然后你可以用你的和来完成这个抽象类SecondKind。这将使对象像字符串一样保持不可变。我不会给它任何隐式转换运算符。