Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#用具体属性覆盖抽象属性_C# - Fatal编程技术网

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.