Mam dwa różne rodzaje ciągów, które przechodzę i wykorzystuję w moim kodzie, i dwa są ze sobą ściśle powiązane, ale nie powinny być ze sobą powiązane. Pomyślałem, że mógłbym pomóc sobie uniknąć błędów, mając dwie klasy, które są tylko ciągami, ale z różnymi nazwami tak, że sygnatury metod (i ogólnie niekompatybilność) wymusiliby semantyczne znaczenie dwóch różnych rodzajów łańcuchów. W tym samym czasie nie chciałem mieć refaktoryzatora od something = "foo";
do something.Value = "foo";
w stu miejscach.Jak deklarować pochodne klasy "powłoki", które nic nie robią, ale działają jako nazwy?
Pierwsza myśl:
private class FirstKind : string { }
private class SecondKind : string { }
Pomysł jest, że jeśli mam
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
, a następnie spróbuj wywołać ją z MyMethod(secondKindVar, firstKindVar);
, to pojawia się błąd kompilatora.
Ściana, którą wybrałem: string
jest zaplombowana.
Druga myśl: stwórz ogólną klasę KindOf<T>
, która nie zrobiłaby niczego oprócz przyjmowania i wypluwania wartości za pomocą niejawnych operatorów konwersji. Tak:
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); }
}
ten sposób mógłby zrobić coś takiego:
private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
ścienny uderzę: Nic z klasy KindOf<T>
wydaje się dziedziczyć: ani konstruktorzy ani operatorzy występują we wszystkich typach pochodnych, co oznacza, Muszę ponownie wdrożyć zasadniczo całą klasę bazową w klasach pochodnych. Kopiowanie kodu. Fuj.
Czuję, że brakuje tu czegoś podstawowego, a może jestem w chwastach. Jakieś pomysły na to, co próbuję zrobić?
Może mógłbyś wyjaśnić, co oznaczają "dwa różne rodzaje strun"? –
Poza tym, może być konieczne zaimplementowanie niejawnych operatorów i konstruktorów w podklasach. Tak, coś w rodzaju kopiowania kodu, ale przynajmniej nie używa zawiłego procesu lub dziedziczenia, gdy dziedziczenie tak naprawdę nie komunikuje niczego realnego (retorycznie, co to jest "KindOf" i czy to naprawdę ma znaczenie?) I jest po prostu aby zredukować duplikację kodu na klasach, które nie mają nic wspólnego poza podobną składnią (ale różnymi zastosowaniami) –
Uzgodnione, klasy naprawdę nie powinny być w tej samej hierarchii dziedziczenia, szczególnie biorąc pod uwagę, że nie * chcesz *, aby się do nich odnosić przez wspólny typ, chcesz, aby pozostały odrębne. – Servy