C#使用更具体的类型覆盖抽象属性

问题描述

我有一个相当简单的问题,但是我在任何地方都找不到合适的解决方案。我想在我的抽象父类中指定一个抽象对象CustomValues作为属性。但是,从其继承的类应该能够使用更特定的类型作为此属性CustomValues的对象。起初,我以为我可以通过界面解决问题,但是不幸的是,这也没有解决。您如何做那样的事,它能起作用?

public abstract class MyAbstract {
    public abstract object CustomValues { get; set; }
}

public class MyImplementation : MyAbstract {
    public override MySpecificclass CustomValues { get; set; }
}

这将引发三个错误

  • 缺少getter的实现
  • 缺少二传手的实现方式
  • 类型objectMySpecificclass间的类型不匹配

解决方法

注释中建议的解决方案如下所示。 (我假设CustomValues应该是某物的集合。)

public class MyClass<T>
{
    public ICollection<T> CustomValues { get; set; }
}

或者确保CustomValues本身不能被重新分配,但是可以被访问并添加到:

public class MyClass<T>
{
    public ICollection<T> CustomValues { get; } = new List<T>();
}
,

我认为您最初使用接口(+通用)的想法是正确的。通常,您可能还需要添加类型约束。

public interface ICustomValues {
  ....
}

public class MySpecificClass : ICustomValues {
  ....
}

public abstract class MyAbstract<T> where T : ICustomValues {
   public abstract T CustomValues {
     get;
     set;
   }
}


public class MyImplementation: MyAbstract<MySpecificClass>  {
  public override   MySpecificClass CustomValues { get; set; }
}
,

谢谢大家。我通过使用通用正确地找到了解决方案:

public abstract class MyAbstract<T> {
    public abstract T CustomValues { get; set; }
}

public class MyImplementation : MyAbstract<MySpecificClass> {
    public override MySpecificClass CustomValues { get; set; }
}