C#類的繼承:子類--父類

轉至:https://blog.csdn.net/yanhuatangtang/article/details/72772215

爲了避免冗餘,將幾個類中重複的成員單獨拿出來封裝成一個類,作爲這幾個類的父類。

父類---子類       基類----派生類

子類沒有繼承到父類的私有(private)字段,可以繼承屬性(public)和方法。

1、一個子類只能有一個父類(單根性)

2、可以傳遞性繼承(傳遞性)

查看類之間的關係可以通過  查看類圖選項,  選中解決方案,右鍵,查看類圖。

子類沒有繼承父類的構造函數

子類會默認調用父類的無參數構造函數,因爲要創建父類對象,讓子類可以使用父類中的成員。如果在父類中重新寫了一個有參數的構造函數,無參數的構造函數被覆蓋,子類就無法調用無參數的構造函數,子類報錯。

解決方法:

1、在父類中重新寫一個無參數的構造函數;

2、在子類中顯示的調用父類的有參數的構造函數,使用關鍵字base( );  // 一般使用此方法

子類中的方法名和父類中的方法名相同時,子類將父類的方法自動隱藏。在方法名前面加上關鍵字new,徹底將從父類繼承的方法隱藏。

子類可以直接調用父類的方法。
 

public class Person
    {
        string _name;
        public string Name
        {
            get{return  _name;}
            set{_name=value;}
        }
        public Person(string name)
        {
            this.Name=name;
        }    
    }
public class student:Person
{
    public  strudent(string  name, int gender,int age,int id) 
        :base(name,gender,age)
{
    this.Id=id;
}
}
public class teacher:Person
{
 
}

在項目中不應該把類都放在一個項目中。

   //  正確顯示的格式
         int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        student(string name,int ag)
            : base(name)
        {
            _age = Age;
        }

假設父類子類都含有方法  public void  print(){   }
若在子類中將此方法隱藏,則爲 public new  void print() {    }

再次總結new的作用:

1、創建對象;

2、隱藏父類那裏繼承過來的同名成員,使子類調用不到父類的成員。

如果一個類沒有繼承其他類,默認繼承object類;其實:在C#中所有的類都直接或間接的繼承object類。

調用(父類與子類)

子類對象可以調用父類對象的成員,但是父類對象不可以調用子類的成員,只能調用自身的成員。

1、子類可以賦值給父類:應用  如果有一個地方需要一個父類做參數,我們可以用一個子類代替。
 

Person  per=new student(); 或者寫成
Student  str=new  student ( );
Person s=str; 

2、如果父類中裝的是子類對象,那麼可以將父類強制轉換爲子類對象;
如 上面的例子,滿足Person s=str;   則 強制轉換 : student   ss = (student) s;

由於teacher是person的子類,但是不可以teacher tt=(teacher)s;  因爲父類中裝的是子類student中的對象。

需要進行判斷一下,使用is  或者  as
 

if(s is teacher){  // 成功返回TRUE,失敗返回FALSE
Teacher tt=(Teacher)s;
}else {  }
或者使用as
Teacher  t= s as Teacher;  //  成功返回正確結果,錯誤返回NULL

父類與子類舉例:

namespace convert
{
    class Program
    {
        static void Main(string[] args)
        {
            Person[] people = new Person[10];  // 存在了父類數組中
            Random num = new Random();
            for (int i = 0; i < 10; i++)
            {
                int rand = num.Next(1, 6);  // 產生隨機數,注意這裏是產生1-6之間的隨機數,不包括6,  只產生0 、1、2、3、4、5
                switch (rand)
                {
                    case 1:
                        people[i] = new Vivi(); // 子類可以賦值給父類
                        break;
                    case 2:
                        people[i] = new Ququ();
                        break;
                    case 3:
                        people[i] = new Evil();
                        break;
                    case 4:
                        people[i] = new Wea();
                        break;
                    case 5:
                        people[i] = new Ewi();
                        break;
                    default:
                        people[i] = new Person();
                        break;
                }
            }
            for (int i = 0; i < 10; i++)
            {
                if (people[i] is Vivi)
                {
                    ((Vivi)people[i]).showvivi();  //  父類可以轉換爲子類(前提是父類裝的是子類)
                }
                else if (people[i] is Ququ)
                {
                    ((Ququ)people[i]).showququ();
                }
                else if (people[i] is Evil)
                {
                    ((Evil)people[i]).showevil();
                }
                else if (people[i] is Wea)
                {
                    ((Wea)people[i]).showwea();
                }
                else if (people[i] is Ewi)
                {
                    ((Ewi)people[i]).showpeewi();
                }
            }
            Console.ReadKey();
        }
        // 父類與子類的關係  5個子類
        public class Person
        {
            public void showpeson()
            {
                Console.WriteLine("hello,i'm person");
            }
        }
        public class Vivi : Person
        {
            public void showvivi()
            {
                Console.WriteLine("hello,i'm vivi");
            }
        }
        public class Ququ : Person
        {
            public void showququ()
            {
                Console.WriteLine("hello,i'm Ququ");
            }
        }
        public class Evil : Person
        {
            public void showevil()
            {
                Console.WriteLine("hello,i'm Evil");
            }
        }
        public class Wea : Person
        {
            public void showwea()
            {
                Console.WriteLine("hello,i'm Wea");
            }
        }
        public class Ewi : Person
        {
            public void showpeewi()
            {
                Console.WriteLine("hello,i'm ewi");
            }
        }
 
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章