C#用更具体的类型重写抽象属性

C#用更具体的类型重写抽象属性,c#,abstract-class,C#,Abstract Class,我有一个相当简单的问题,但我在任何地方都找不到合适的解决方案。我想在抽象父类中指定一个抽象对象CustomValues作为属性。但是,从中继承的类应该能够使用更特定的类型作为此属性CustomValues的对象。起初我以为我可以通过一个接口来解决这个问题,但不幸的是,这也没有成功。你是怎么做到的,它是怎么工作的 公共抽象类MyAbstract{ 公共抽象对象CustomValues{get;set;} } 公共类MyImplementation:MyAbstract{ 公共重写MySpecifi

我有一个相当简单的问题,但我在任何地方都找不到合适的解决方案。我想在抽象父类中指定一个抽象对象CustomValues作为属性。但是,从中继承的类应该能够使用更特定的类型作为此属性CustomValues的对象。起初我以为我可以通过一个接口来解决这个问题,但不幸的是,这也没有成功。你是怎么做到的,它是怎么工作的

公共抽象类MyAbstract{
公共抽象对象CustomValues{get;set;}
}
公共类MyImplementation:MyAbstract{
公共重写MySpecificClass自定义值{get;set;}
}
这将给我带来三个错误:

  • 缺少getter的实现
  • setter缺少实现
  • 类型
    对象
    MySpecificClass

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

      public abstract class MyAbstract<T> {
          public abstract T CustomValues { get; set; }
      }
      
      public class MyImplementation : MyAbstract<MySpecificClass> {
          public override MySpecificClass CustomValues { get; set; }
      }
      
      公共抽象类MyAbstract{
      公共抽象T自定义值{get;set;}
      }
      公共类MyImplementation:MyAbstract{
      公共重写MySpecificClass自定义值{get;set;}
      }
      
      谢谢大家。我通过正确地使用通用找到了解决方案:

      public abstract class MyAbstract<T> {
          public abstract T CustomValues { get; set; }
      }
      
      public class MyImplementation : MyAbstract<MySpecificClass> {
          public override MySpecificClass CustomValues { get; set; }
      }
      
      公共抽象类MyAbstract{
      公共抽象T自定义值{get;set;}
      }
      公共类MyImplementation:MyAbstract{
      公共重写MySpecificClass自定义值{get;set;}
      }
      
      评论中建议的解决方案看起来像这样。(我假设
      CustomValues
      应该是一些东西的集合。)


      评论中建议的解决方案类似于此。(我假设
      CustomValues
      应该是一些东西的集合。)


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

      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; }
      }
      
      公共接口ICustomValues{
      ....
      }
      公共类MySpecificClass:ICustomValues{
      ....
      }
      公共抽象类MyAbstract,其中T:ICustomValues{
      公共抽象价值观{
      得到;
      设置
      }
      }
      公共类MyImplementation:MyAbstract{
      公共重写MySpecificClass自定义值{get;set;}
      }
      
      我认为您最初使用接口(+generic)的想法是正确的。通常,您可能还需要添加类型约束

      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; }
      }
      
      公共接口ICustomValues{
      ....
      }
      公共类MySpecificClass:ICustomValues{
      ....
      }
      公共抽象类MyAbstract,其中T:ICustomValues{
      公共抽象价值观{
      得到;
      设置
      }
      }
      公共类MyImplementation:MyAbstract{
      公共重写MySpecificClass自定义值{get;set;}
      }
      
      研究派生的泛型类。这就是你要找的<代码>对象是一种非常糟糕的返回类型。您必须将结果强制转换为特定类型,始终冒着错误强制转换的风险。创建泛型方法instead@PanagiotisKanavos问题是,这个CustomValues属性将被JSON.net序列化。我只是想确保,所有派生类都有CustomValues属性。您需要定义T:
      公共抽象类MyAbstract
      (可能是
      公共抽象类MyAbstract,其中T:class
      )FWIW,C#9将有。研究派生泛型类。这就是你要找的<代码>对象是一种非常糟糕的返回类型。您必须将结果强制转换为特定类型,始终冒着错误强制转换的风险。创建泛型方法instead@PanagiotisKanavos问题是,这个CustomValues属性将被JSON.net序列化。我只是想确保所有派生类都有CustomValues属性。您需要定义T:
      公共抽象类MyAbstract
      (可能是
      公共抽象类MyAbstract,其中T:class
      )FWIW,C#9。您可能根本不需要派生类。(只是猜测您认为您需要它,因为您以前不知道如何使用泛型。)@stacktoverp该类用于通过REST控制API,REST生成报告。根据文档类型(由字符串参数定义,在我的示例中没有),CustomValues必须包含不同的值。所以我的想法是定义一个抽象类,然后为每个文档类型定义一个特定的实现。这个问题能得到更好/更简单的解决吗?我建议阅读有关的内容,并询问您真正想做什么。您可能根本不需要派生类。(只是猜测您认为您需要它,因为您以前不知道如何使用泛型。)@stacktoverp该类用于通过REST控制API,REST生成报告。根据文档类型(由字符串参数定义,在我的示例中没有),CustomValues必须包含不同的值。所以我的想法是定义一个抽象类,然后为每个文档类型定义一个特定的实现。这个问题能得到更好/更简单的解决吗?我建议你读一读关于这个问题的书,问一个关于你真正想做什么的问题。