【发布时间】:2010-08-23 19:32:42
【问题描述】:
我正在尝试使用不同但具有相同名称的派生类型覆盖基类中的属性。我认为它可能通过协方差或泛型实现,但不知道该怎么做?
以下代码得到错误:
错误 1 'Sun.Cache':类型必须是 'OuterSpace.Cache' 匹配被覆盖 成员'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.
对于最终结果,当我处理 Sun 的“数据”对象时,我不希望有两个数据对象(继承和基类),但是当我尝试覆盖该属性时,它需要 Sun 变量与基类相同的类型。例如:
Sun EarthSun = new Sun()
EarthSun.Analyse() //The OuterSpace Analysis Saves results to Sun Cache:
//Now try use the result:
EarthSun.Cache[0]...
与此非常相似,但使用派生类型而不是字符串数组: C# Member variable overrides used by base class method
这个答案对我来说没有多大意义: How to override member of base class after inheritance in C++
或者这意味着它不可能? Can I Override with derived types?
帮助! :) 有什么解决办法吗?
【问题讨论】:
-
有点跑题了,但是说太阳是一种外太空有意义吗?这里的一些尴尬可能来自使用继承,而更简单的结构就足够了。
-
我欢迎建议?这是问题的demo伪代码,实际项目很大,只是在为未来做打算。
-
仅从您提供的示例结构很难说。要考虑的主要事情是您实际上是如何使用这些类的。特别是 Cache、Analysis 和 Data 类的什么使得将它们作为基类访问是有益的?您有一个协调分析的类,但似乎每种分析的协调也不同;这向我暗示了可能需要进一步调查的隐藏责任。如果您还没有通用结构的用例,我会避免使用它;雅尼。
-
嘿:我有 30-40 种复杂算法,它们访问标准化的“OuterSpace”类 - 其中时间序列数据根据基数(DateTime-Value)存储。但是对于例如太阳类型(那里有许多不同的太阳);你还有额外的数据+额外的算法。 90% 的分析可以使用基类算法(访问基类存储变量)完成,但 10% 的 Sun 算法位于 SunAnalysis 类中。通过简单地继承基类,我可以轻松访问他们的算法 + 数据。
-
听起来你肯定需要可扩展性,所以这实际上只是它的结构问题。我个人的第一印象是继承和关联的耦合有点难以理解,可能有更好的方法来拆分事物以使组件彼此隔离。您可能会问的一个问题是,您是否可以独立于逻辑的其余部分来测试逻辑的单个部分(例如“额外”逻辑)。这可能会引导您到自然的地方来分解事物并减少耦合。
标签: c# inheritance overriding covariance