1. 程式人生 > >八、C#入門基礎08(封裝,繼承,多型)

八、C#入門基礎08(封裝,繼承,多型)

一、封裝

C#中可使用類來達到資料封裝的效果,這樣可以使資料與方法封裝成單一元素,以便於通過方法存取資料。除此之外,還可以控制資料的存取方式。
在面向物件程式設計中,大多數都是以類作為資料封裝的基本單位。類將資料和操作資料的方法結合成一個單位。設計類時,不希望直接存取類中的資料,而是希望通過方法來存取資料。這樣就可以達到封裝資料的目的,方便以後的維護升級,也可以在操作資料時多一層判斷。
此外,封裝還可以解決資料存取的許可權問題,可以使用封裝將資料隱藏起來,形成一個封閉的空間,然後可以設定哪些資料只能在這個空間中使用,哪些資料可以在空間外部使用。一個類中包含敏感資料,有些人可以訪問,有些人不能訪問,如果不對這些資料的訪問加以限制,後果將會非常嚴重。所以要對類的成員使用不同的訪問修飾符,從而定義他們的訪問級別。

封裝語法:
Public 資料型別 變數名
{
get
{
return 變數名;
}
set
{
變數名=value;
}
}

二、繼承

繼承是面向物件最重要的特性之一。任何類都可以從另外一個類繼承,這就是說,這個類擁有它繼承類的所有成員。在面向物件程式設計中,被繼承的類稱為父類或基類。C#中提供了類的繼承機制,但只支援單繼承,而不支援多繼承,即在C#一次只允許繼承一個類,不能同時繼承多個類。

繼承語法:
Public class 類名:父類名

如何使用父類裡面的成員變數,方法,建構函式?
關鍵字:base

成員變數:
base.成員變數名
方法:
base.方法名

三、多型

多型性意味著有多重形式。
在面向物件程式設計正規化中,多型性往往表現為”一個介面,多個功能”。
多型性可以是靜態的或動態的。
在靜態多型性中,函式的響應是在編譯時發生的。
在動態多型性中,函式的響應是在執行時發生的。

1.靜態多型性
在編譯時,函式和物件的連線機制被稱為早期繫結,也被稱為靜態繫結。C# 提供了兩種技術來實現靜態多型性。
分別為:
1.1方法過載:
可以在同一個範圍內對相同的方法名有多個定義。
方法的定義必須彼此不同,可以是引數列表中的引數型別不 同,也可以是引數個數不同。
不能過載只有返回型別不同的方法宣告。

2.動態多型性
當有一個定義在類中的函式需要在繼承類中實現時,可以使用虛方法。
2.1:虛方法是使用關鍵字 virtual 宣告的。
2.2:虛方法可以在不同的繼承類中有不同的實現。
2.3:對虛方法的呼叫是在執行時發生的。
2.4:動態多型性是通過抽象類和虛方法實現的。

定義虛方法:
訪問修飾符 virtual 返回的資料型別/void 方法名()
{
//執行程式碼,也可以完全不寫
}
重寫父類的方法(子類中):
訪問修飾符 override 返回的資料型別/void 方法名()
{
//執行程式碼
}

四、程式碼:

1.Dog類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _08
{
    public class Dog
    {
        private string _name;
        private int _age;
        private string _sex;  

        //propfull 再雙擊tab生成如下程式碼:
        /*
        private int myVar;

        public int MyProperty
        {
            get { return myVar; }
            set { myVar = value; }
        }*/




        public int Age
        {
            get { return _age; }
            set
            {
                if (value>0&&value<17)
                {
                    _age = value;
                }
                else
                {
                    _age = 0;
                }
            }
        }

        public string Name
        {
            get
            {
                return _name;
            }

            set
            {
                _name = value;
            }
        }

        public int Age1
        {
            get
            {
                return _age;
            }

            set
            {
                _age = value;
            }
        }

        public string Sex
        {
            get
            {
                return _sex;
            }

            set
            {
                _sex = value;
            }
        }

        public int GetAge() {
            return _age;
        }

        public void SetAge(int age) {
            if (age > 0 && age < 17)
            {
                _age = age;
            }
            else {
                _age = 0;
            }
        }


    }
}

2.父類:Student(MinStudent和MaxStudent的父類)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _08
{
    public class Student
    {
        private string _name;
        private int _age;
        private char _sex;

        public Student() { }

        public Student(string _name, int _age, char _sex)
        {
            this._name = _name;
            this._age = _age;
            this._sex = _sex;
        }

        public string Name
        {
            get
            {
                return _name;
            }

            set
            {
                _name = value;
            }
        }

        public int Age
        {
            get
            {
                return _age;
            }

            set
            {
                _age = value;
            }
        }

        public char Sex
        {
            get
            {
                return _sex;
            }

            set
            {
                _sex = value;
            }
        }

        public string GetMe(){
            return string.Format("姓名:{0},性別:{1},年齡:{2}", this.Name, this.Sex, this.Age);
        }

        //只定義而不實現的方法 我們叫做虛方法 虛方法也可以有方法體({中間的實現程式碼})
        public virtual void ShowMe() {

        }


    }
}

3.子類:MinStudent(父類是Student)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _08
{
    //小學生
    public class MinStudent:Student
    {
        private string _class;

        public MinStudent() { }

        //base 基礎
        public MinStudent(string _class, string _name, int _age, char _sex):base(_name,_age,_sex)
        {
            this._class = _class;
        }

        public string Class
        {
            get
            {
                return _class;
            }

            set
            {
                _class = value;
            }
        }

        //public void ShowMe() {
        //    string str=base.GetMe();
        //    Console.WriteLine("{0},年級:{1}",str,this.Class);
        //    Console.ReadKey();
        //}

        public override void ShowMe()
        {
            string str = base.GetMe();
            Console.WriteLine("{0},年級:{1}",str,this.Class);
            Console.ReadKey();
        }





    }
}

4.子類:MaxStudent(父類是Student)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _08
{
    //大學生
    public class MaxStudent:Student
    {
        private string _department;

        public MaxStudent() { }

        public MaxStudent(string _department, string _name, int _age, char _sex) :base(_name, _age, _sex)
        {
            this._department = _department;
        }

        public string Department
        {
            get
            {
                return _department;
            }

            set
            {
                _department = value;
            }
        }

        //public void ShowMe()
        //{
        //    string str = base.GetMe();
        //    Console.WriteLine("{0},系:{1}", str, this.Department);
        //    Console.ReadKey();
        //}

        public override void ShowMe()
        {
           string str = base.GetMe();
           Console.WriteLine("{0},系:{1}", str, this.Department);
           Console.ReadKey();
        }


    }
}