【问题标题】:Override the property of an abstract class覆盖抽象类的属性
【发布时间】:2015-10-29 09:34:27
【问题描述】:

我想输出我的tiger1 实例的numberOfLegs。但是输出是 0 而不是我预期的 4。我的错误在哪里?请帮助老虎把腿找回来。

using System;

namespace AbstractProperty
{
    class MainClass
    {
        static void Main(string[] args)
        {
            Tiger tiger1 = new Tiger();
            int result = tiger1.NumberOfLegs;
            Console.WriteLine(result);
            Console.Read();
        }

        public abstract class Animal
        {
            public abstract int NumberOfLegs { get; set; }
        }

        public class Tiger : Animal
        {
            private int numberOfLegs;
            public override int NumberOfLegs
            {
                get
                {
                    return numberOfLegs;
                }
                set
                {
                    numberOfLegs = 4;
                }

            }
        }
    }
}

编辑:我认为在 Setter 中使用 numberOfLegs = 4 不好

【问题讨论】:

    标签: c# inheritance properties overriding abstract


    【解决方案1】:

    正如我所见,NumberOfLegsset 访问器永远不会被调用,因此 numberOfLegs 的默认值为 0。
    您可以编写一个构造函数并为NumberOfLegs 分配一些值,因为您在set 访问器中硬编码了4,所以无论如何都会分配4,即如果您这样编写构造函数:

    public Tiger() {
      NumberOfLegs = 10;
    }
    

    将调用set 访问器并将4(不是10)分配给numberOfLegs。也许你在这里混淆了一些概念:)

    编辑 1: 如果您现在了解在 setter 中分配硬编码值并不是那么好,并且您不想在 setter 中做任何特别的事情,那会更好对属性使用传统方法:

    private int numberOfLegs;
    public override int NumberOfLegs
    {
        get
        {
            return numberOfLegs;
        }
        set
        {
            numberOfLegs = value;
        }
    }
    

    或者干脆

    public override int NumberOfLegs { get; set; }
    

    与上述相同。
    并在构造函数中为NumberOfLegs赋值:

    public Tiger() 
    {
      NumberOfLegs = 4;
    }
    

    【讨论】:

    • 这是我第一次尝试抽象类。谢谢
    • 但是我不应该使用这个集合,因为 numberOfLegs 不会改变。
    • 是的,这取决于您,您可以将 set 设为私有,以便只能从类中分配它,或者更好的是您可以使用只读字段或属性。 msdn.microsoft.com/en-us/library/acdd6hb7.aspx
    【解决方案2】:

    不会调用 NumberOfLegs 属性设置器,因为您没有更改代码中任何位置的值。 int 值默认为零。您可以执行以下操作之一:

    1. 在声明时定义numberOfLegs变量的默认值:

    private int numberOfLegs = 4;

    1. 在Tiger类的构造函数中定义numberOfLegs值:
    public class Tiger : Animal
    {
      private int numberOfLegs;
      public Tiger() {
          numberOfLegs = 4;
      }
    
      // ...
    }
    

    【讨论】:

      【解决方案3】:

      你做错了...

      不要为numberOfLegs 提供setter。只需提供一个吸气剂。然后在构造函数中设置腿数,或者直接设置字段,像这样:

      public abstract class Animal
      {
          public abstract int NumberOfLegs { get; }
      }
      
      public class Tiger : Animal
      {
          private int numberOfLegs = 4;
          public override int NumberOfLegs
          {
              get
              {
                  return numberOfLegs;
              }
          }
      }
      

      您的代码无法正常工作的原因是因为您没有调用 Tiger.NumberOfLegs 的设置器,但当然如果您这样做了,您就会意识到这是多么错误:

      Tiger tiger1 = new Tiger();
      tiger1.NumberOfLegs = 100;
      int result = tiger1.NumberOfLegs; // Set to 100, but now it's 4! Urk.
      

      【讨论】:

      • 嗨 Matthew,在构造函数中设置和直接设置字段有什么区别?
      • @kame 直接设置字段的好处是不需要在构造函数中设置,即使有多个构造函数。除此之外,int 类没有区别。另请注意,您可以将其设为常量而不是字段。
      猜你喜欢
      • 1970-01-01
      • 2011-08-14
      • 2023-03-04
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多