C#用具体属性覆盖抽象属性
所以我有一个抽象类。它有一个抽象类型列表C#用具体属性覆盖抽象属性,c#,C#,所以我有一个抽象类。它有一个抽象类型列表 public abstract class BaseClass { public abstract List<A> History { get; set; } 公共抽象类基类 { 公共摘要列表历史记录{get;set;} 和继承器类 public class ConcreteClass : BaseClass { public override List<B> History { get; set; } 公
public abstract class BaseClass
{
public abstract List<A> History { get; set; }
公共抽象类基类
{
公共摘要列表历史记录{get;set;}
和继承器类
public class ConcreteClass : BaseClass
{
public override List<B> History { get; set; }
公共类ConcreteClass:基类
{
公共覆盖列表历史记录{get;set;}
我的问题很简单。为什么这会返回一个错误。A是b继承的抽象类。那么为什么我不能让具体属性重写抽象属性呢?
注意:由于其他问题,我不能在基类中使用泛型。这个问题需要澄清。我正在使用mvc,由于动态类型的一些问题,我不能说
BaseClass
,在其他一些领域,方法调用名为GetHistory()的方法它需要归还具体的清单而不是抽象的列表。所以我被困在一块岩石和一个坚硬的地方。 < P>你可以考虑的一种方法是:
public class ConcreteClass : BaseClass<ListClass>
{
public override List<ListClass> History { get; set; }
}
public abstract class BaseClass<T> where T : BaseListClass
{
public abstract List<T> History { get; set; }
}
public abstract class BaseListClass
{
}
public class ListClass : BaseListClass
{
}
公共类ConcreteClass:基类
{
公共覆盖列表历史记录{get;set;}
}
公共抽象类基类,其中T:BaseListClass
{
公共摘要列表历史记录{get;set;}
}
公共抽象类BaseListClass
{
}
公共类ListClass:BaseListClass
{
}
通过让具体类指定它想要使用的确切泛型类型(re:基类型),那么它可能适合您的目的
为什么会返回错误。A是B继承的抽象类
再一次,这个问题几乎每天都有人问
abstract class Fruit
{
public virtual List<Fruit> M() { return new List<Fruit>(); }
}
class Apple : Fruit
{
public override List<Apple> M() { return new List<Apple>(); }
}
这不会破坏类型系统;这是安全的,但它仍然是非法的。这只是因为<强>虚拟返回类型协方差>在C++中从未实现过。
它之所以没有被实现,是因为它从来都不是C#团队的首要任务。十多年来人们一直在要求它,但它并不是一个很好的功能。也许它最终会实现;如果你对此有强烈的感觉,请加入github上的论坛并为它辩护。因为如果我这样做
BaseClass C=new ConcreteClass()然后我必须能够将A
的任何子类的实例添加到c.History
中。好吧,这取决于你想做什么。你能后退一步,描述一下你想用这个来解决什么吗?A
和B
都实现相同的接口吗?如果它们以类似的方式使用,那么e可能有一些相似之处。在这种情况下,您可以将列表设置为IHistory类型或其他任何类型。列表历史{get;set;}
@trinityalps:您并没有真正添加到问题中您实际要做的事情。也没有详细说明您所说的“MVC中动态类型的问题”是什么意思.为什么会返回错误。
在这种情况下,与我们共享编译器错误非常重要。这会使您更容易获得帮助。有关返回类型协方差的详细信息:。
class Banana : Fruit { }
...
Fruit f = new Apple(); // Legal
List<Fruit> bowl = f.M(); // calls Apple.M, returns a list of apples.
bowl.Add(new Banana());
abstract class Fruit
{
public virtual Fruit N() { return new Banana(); }
}
class Apple : Fruit {
public override Apple N() { return new Apple(); }
}
...
Fruit f1 = new Apple();
Fruit f2 = f1.N(); // No problem, an apple is a fruit.