簡體   English   中英

覆蓋抽象類的屬性

[英]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;
                }

            }
        }
    }
}

編輯:我認為在二傳手中使用numberOfLegs = 4不好

不會調用NumberOfLegs屬性設置器,因為您沒有在代碼中的任何地方更改值。 默認情況下,int值為零。 您可以執行以下操作之一:

  1. 在聲明時,定義numberOfLegs變量的默認值:

private int 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;
        }
    }
}

您的代碼無法正常工作的原因是,您沒有調用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM