覆盖摘要 class 的 属性

Override the property of an abstract class

我想输出我的 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 不好

NumberOfLegs 属性 setter 未被调用,因为您没有在代码中的任何地方更改值。 int 值默认为零。您可以执行以下操作之一:

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

私人 int numberOfLegs = 4;

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

  // ...
}

你做错了...

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

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 调用 setter,但当然,如果您这样做了,您就会意识到这是多么错误:

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

如我所见,从未调用 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;
}