覆盖带有派生类型和相同名称的属性C#

前端之家收集整理的这篇文章主要介绍了覆盖带有派生类型和相同名称的属性C#前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图用一个不同的但派生类型覆盖基类中的属性,具有相同的名称.我认为它可能是通过混合或泛型,但不知道该怎么做?

以下代码获取错误

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属性,然后调用中间属性.这真的是一个丑陋的黑客,虽然我已经做到了,我不会推荐它.

猜你在找的C#相关文章