簡體   English   中英

C#基類方法無法讀取派生類中的實例屬性

[英]C# base class method can not read instance attribute which is in derived class

using System;

class BaseClass
{

    public string name;

    public BaseClass()
    {
        this.name = "MyName";
    }

    public virtual void A()
    {
        Console.WriteLine(this.surname); // error. BaseClass does not definition of surname
    }

}

class DerivedClass : BaseClass
{
    public string surname;

    public DerivedClass()
    {
        this.surname = "MySurname";
    }
}

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {

            DerivedClass dc = new DerivedClass();
            dc.A();

            Console.ReadKey();
        }
    }
}

有人可以向我解釋嗎? 我知道, BaseClass不包含的定義surname ,但我打電話A()從法DerivedClass對象( this.surname - this是一個對象DerivedClass )。 DerivedClass對象包含有關namesurname 為什么不可能通過A()方法訪問surname 這對我來說非常有趣,因為在Python中此模型可以完美運行。 代碼如下。

class BaseClass:

    def __init__(self):
        self.name = 'MyName'

    def a(self):
        print(self.surname)

class DerivedClass(BaseClass):

    def __init__(self):
        super().__init__()
        self.surname = 'MySurname'

if __name__ == '__main__':
    dc = DerivedClass()
    dc.a()

對不起,我的英語不好。

surname字段僅在Derived類中可用,您應該在派生類中覆蓋虛擬方法:

using System;

class BaseClass
{

    public string name;

    public BaseClass()
    {
        this.name = "MyName";
    }

    public virtual void A()
    {
        Console.WriteLine($"Hi {name}, I don't know your surname here");
    }

}

class DerivedClass : BaseClass
{
    public string surname;

    public DerivedClass()
    {
        this.surname = "MySurname";
    }

   // HERE:
    public override void A()
    {
        // the 'this' and 'base' are just for clarification and are optional.
        Console.WriteLine($"Hi {base.name} {this.surname}, how are you.");
    }
}

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {

            DerivedClass dc = new DerivedClass();
            dc.A();

            // It's even possible to store the derived class in a base class variable
            BaseClass bc = new DerivedClass();
            bc.A(); // it will still execute the overriden method.

            Console.ReadKey();
        }
    }
}

您的baseClass不必由具有surname屬性的類繼承。

如J. van Langen所述,您仍然可以使用其基類聲明類

using System;

class BaseClass
{
    public string name;

    public BaseClass()
    {
        this.name = "MyName";
    }

    public virtual void A()
    {
        Console.WriteLine("Looks like I have no surname");
    }
}

class DerivedClass : BaseClass
{
    public string surname;

    public DerivedClass()
    {
        this.surname = "MySurname";
    }

    public override void A()
    {
        Console.WriteLine(this.surname);
    }
}

class AnotherDerivedClass : BaseClass
{
    public string IHaveNoSurname;

    public AnotherDerivedClass()
    {
        this.IHaveNoSurname = "Well, no surname for me...";
    }
}

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            List<BaseClass> MyClasses = new List<BaseClass>();
            MyClasses.Add(new DerivedClass());
            MyClasses.Add(new AnotherDerivedClass());

            foreach (BaseClass MyClasse in MyClasses)
            {
                Console.WriteLine(MyClasse.GetType());
                MyClasse.A();
            }
            Console.ReadKey();
        }
    }
}

輸出:

DerivedClass

我的姓

AnotherDerivedClass

看起來我沒有姓

暫無
暫無

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

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