覆盖抽象类的属性

时间:2015-10-29 09:34:27

标签: c# inheritance properties override abstract

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

3 个答案:

答案 0 :(得分:1)

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

  1. 在声明时定义numberOfLegs变量的默认值:
  2. private int numberOfLegs = 4;

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

答案 1 :(得分:1)

你做错了......

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

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的设置者,但当然如果您这样做,您就会意识到它有多么错误:< / p>

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

答案 2 :(得分:1)

如我所见,永远不会调用set的{​​{1}}访问者,因此NumberOfLegs的默认值为0。 您可以编写一个构造函数并为numberOfLegs分配一些值,因为您在NumberOfLegs访问器中使用了硬编码4,因此将分配4,即如果您按照以下方式编写构造函数:

set

将调用public Tiger() { NumberOfLegs = 10; } 访问者并将set(不是4)分配给10。也许你在这里混淆了一些概念:)

编辑1:如果您现在明白在设置器中分配硬编码值并不是那么好,并且您不想在设置器中执行任何特殊操作,那么更好地使用传统的属性方法:

numberOfLegs

或者只是

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

与上述相同。
并在构造函数中为public override int NumberOfLegs { get; set; } 赋值:

NumberOfLegs