У меня есть два разных типа строк, которые я просматриваю и использую в своем коде, и эти два тесно связаны друг с другом, но их не следует путать друг с другом. Я думал, что могу помочь себе избежать ошибок, имея два класса, которые являются просто строками, но с разными именами, так что сигнатуры методов (и несовместимость типов в целом) будут обеспечивать семантическое значение двух разных типов строк. В то же время я не хотел, чтобы рефакторинг был от 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>
, кажется, не наследует: ни конструкторы, ни операторы не существуют в производных типах, то есть я должен повторно реализовать по существу весь базовый класс в производных классах. Копирование. Тьфу.
Таким образом, я чувствую, что мне не хватает чего-то основного здесь, и, возможно, я ухожу в сорняках. Любые идеи для того, что я пытаюсь сделать?