Geçtiğim ve kodumda kullandığım iki farklı türde dizim var ve ikisi birbiriyle yakından ilişkili, ancak birbiriyle karıştırılmamalıdır. Sadece dizeleri olan iki sınıfa sahip olmaktan ziyade farklı isimlerle hatalardan kaçınmam için yardım edebileceğimi düşündüm, böylece yöntem imzaları (ve genel olarak uyumsuzluğu yazın), iki farklı türdeki dizenin anlamsal anlamını zorlar. Aynı zamanda, yüzlerce yerde something = "foo";
'dan something.Value = "foo";
'a refactor yapmak istemedim.Türetilmiş "kabuk" sınıflarını, hiçbir şey yapmayan, ancak yeniden adlandırılan türler olarak nasıl bildirebilirim?
İlk düşünce:
private class FirstKind : string { }
private class SecondKind : string { }
Ben
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
var, sonra MyMethod(secondKindVar, firstKindVar);
ile aramayı deneyin eğer, bir derleyici hatası olsun ki varlık fikir.
Duvar I çarptı: string
mühürlendi.
İkinci düşünce: hiçbir şey yapmaz, ancak örtük dönüştürme işleçleri ile değeri dışarı çıkarmak ve tükürmek yerine jenerik KindOf<T>
sınıfı oluştur. Şunun gibi:
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); }
}
Böyle bir şey yapabileceğini Bu şekilde: ben vurmak
private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
Duvar: anlam, kurucular ne de operatörler ne türetilmiş türlerinde mevcuttur: KindOf<T>
sınıftan hiçbir şey miras gibi görünüyor Temel olarak bütün sınıfları türetilmiş sınıflarda yeniden uygulamak zorundayım. Kod kopyalama. Yuck.
Bu yüzden burada temel bir şeyi kaçırıyormuşum gibi hissediyorum, belki de yabani otların arasındayım. Ne yapmaya çalıştığım hakkında bir fikrin var mı?
Belki "iki farklı çeşit dizinin" ne anlama geldiğini açıklayabilir misiniz? –
Başımın üst kısmından, alt sınıflardaki örtük operatörleri ve kurucuları uygulamanız gerekebilir. Evet, kod kopyalama gibi bir şey, ama en azından devralma işlemi veya miras gerçekten hiçbir şey (retorik olarak, bir "KindOf" nedir ve gerçekten bir şey ifade ediyor? Orada benzer sözdizimi (ancak farklı kullanımlar) yanında ortak hiçbir şeyi olmayan sınıflar arasında kod çoğaltmayı azaltmak için ( –
Anlaşılan), sınıflar gerçekten de aynı kalıtım hiyerarşisinde olmamalıdır, özellikle * istemiyorsanız * onlara atıfta bulunarak Ortak bir tiple, onların ayrı kalmasını istersiniz. – Servy