我试图用一个不同的但派生类型覆盖基类中的属性,具有相同的名称.我认为它可能是通过混合或泛型,但不知道该怎么做?
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.
对于最终结果,当我处理Sun的“Data”对象时,我不希望有两个数据对象(继承和基类),但是当我尝试覆盖该属性时,它需要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?
帮帮我! :)任何工作?
解决方法
确切地说,这是不可能的.
public new SunData Data { get { return (SunData) base.Data; } set { base.Data = value; } }
这是不一样的事情,但它可能就像你要得到的那样接近.
另一种可能的办法是:
public SunData SunData { get; set; } public override OuterSpaceData Data { get { return SunData; } set { SunData = (SunData)value; } }
这种方法的优点在于它确保不可能在不属于SunData的Data属性中放置某些东西.缺点是您的Data属性没有强类型,如果您希望静态地键入SunData,则必须使用SunData属性.
有一个丑陋的方式来获得“最好的两个世界”,代价是混淆代码,之后难以理解 – 通过引入一个中间派生类,在基类Data属性上进行“密封覆盖”,并重定向到不同的protected属性用一个新的名字,然后让最终的派生类添加一个’new’Data属性,然后调用中间属性.这真的是一个丑陋的黑客,虽然我已经做到了,我不会推荐它.