重写抽象类的属性

本文关键字:属性 抽象类 重写 | 更新日期: 2023-09-27 18:19:41

我想输出我的 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;
                }
            }
        }
    }
}

编辑:我认为在二传手中使用numberOfLegs = 4不好

重写抽象类的属性

如我所见,从不调用 NumberOfLegsset 访问器,因此numberOfLegs的默认值为 0。
您可以编写一个构造函数并为NumberOfLegs分配一些值,无论如何都会为其分配 4,因为您在 set 访问器中硬编码了 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 属性 setter,因为您不会在代码中的任何位置更改值。默认情况下,int 值为零。您可以执行以下操作之一:

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

私有整数腿数 = 4;

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

你做错了...

不要为numberOfLegs提供二传手。只需提供一个吸气剂。然后在构造函数中设置腿数,或者直接设置字段,如下所示:

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

你的代码不起作用的原因是因为你没有调用 setter 进行Tiger.NumberOfLegs,但当然,如果你这样做了,你会意识到它是多么错误:

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