Sto provando a sovrascrivere una proprietà in una classe base con un tipo diverso, ma derivato con lo stesso nome. Penso che sia possibile per covarienza o generici ma non sono sicuro di come farlo?Ignora una proprietà con un tipo derivato e lo stesso nome C#
Il codice seguente ottiene l'errore:
Error 1 'Sun.Cache': type must be 'OuterSpace.Cache' to match overridden member 'OuterSpace.Cache'
public class OuterSpace {
public virtual OuterSpaceData Data {get; set;}
public virtual OuterSpaceAnalysis Analysis {get; set;}
public virtual OuterSpaceCache Cache {get; set;}
public class OuterSpaceData {
//Lots of basic Data Extraction routines eg
public virtual GetData();
}
public class OuterSpaceAnalysis {
//Lots of Generic Analysis on Data routines eg
public virtual GetMean();
}
public class OuterSpaceCache {
//Lots of Caches of Past Analysis Results:
public Dictionary<AnalysisType, List<Result>> ResultCache;
}
}
public class Sun : OuterSpace {
public override SunData Data {get; set;}
public override SunAnalysis Analysis {get; set;}
public override SunCache Cache {get; set;}
public SunData : OuterSpaceData {
//Routines to specific get data from the sun eg
public override GetData();
}
public SunAnalysis : OuterSpaceAnalysis {
//Routines specific to analyse the sun: eg
public double ReadTemperature();
}
public SunCache : OuterSpaceCache {
//Any data cache's specific to Sun's Analysis
public Dictionary<AnalysisType, List<Result>> TempCache;
}
}
public class Moon : OuterSpace {} etc.
Per il risultato finale, quando mi rivolgo l'oggetto "dati" di Sun non voglio che ci sia due Data Objects (ereditato & Base Class) ma quando provo a sovrascrivere la proprietà richiede che le variabili Sun siano dello stesso tipo della classe base. Ad esempio:
Sun EarthSun = new Sun()
EarthSun.Analyse() //The OuterSpace Analysis Saves results to Sun Cache:
//Now try use the result:
EarthSun.Cache[0]...
Molto simile a questo, ma con tipo derivato, invece di string-array: C# Member variable overrides used by base class method
E questa risposta non ha molto senso per me: How to override member of base class after inheritance in C++
O forse questo significa che non è possibile? Can I Override with derived types?
Help! :) Qualche lavoro in giro?
Un po 'fuori tema, ma ha senso dire che Sun è una specie di OuterSpace? Alcune delle difficoltà in questo caso potrebbero derivare dall'uso dell'ereditarietà laddove sarebbe sufficiente una struttura più semplice. –
Accolgo suggerimenti? Questo è un pseudo codice demo del problema, il vero progetto è molto grande e sto solo cercando di pianificare il futuro. – JaredBroad
è difficile da dire solo dalla struttura campione che hai fornito. La cosa principale da considerare è come stai effettivamente _using_ le classi. In particolare, cosa si tratta delle classi Cache, Analysis e Data che rendono vantaggioso accedervi come classi base? Hai una classe che coordina l'analisi, ma sembra anche che il coordinamento sia diverso per ogni tipo di analisi; questo mi suggerisce che sono responsabilità nascoste che potrebbero richiedere ulteriori indagini. Se non si dispone ancora di un caso d'uso per la struttura generica, lo eviterei; YAGNI. –