gpt4 book ai didi

c# - 使用派生类型和同名 C# 覆盖属性

转载 作者:可可西里 更新时间:2023-11-01 08:59:52 25 4
gpt4 key购买 nike

我试图用不同但派生类型相同的名称覆盖基类中的属性。我认为可以通过协变或泛型来实现,但我不确定该怎么做?

以下代码得到错误:

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 的“数据”对象时,我不希望有两个数据对象(继承类和基类),但是当我尝试覆盖该属性时,它要求 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?

帮助! :) 有解决办法吗?

最佳答案

完全按照您想要的方式是不可能的。

您可以创建一个具有相同名称的"new"属性:

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 属性。

有一种丑陋的方法可以实现“两全其美”,但代价是代码困惑和事后难以理解——通过引入一个中间派生类,该派生类对基类数据属性进行“密封覆盖”,并且使用新名称重定向到不同的 protected 属性,然后让最终派生类添加一个"new"数据属性,然后调用中间属性。不过,这确实是一个丑陋的 hack,即使我已经做到了,我也不推荐它。

关于c# - 使用派生类型和同名 C# 覆盖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com