八、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();
}
}
}