面向对象(二)——三大特性(封装、继承、多态)
一、封裝
目的:保護(hù)類,讓類更加安全。
做法:讓類里面的成員變量變?yōu)樗接?#xff08;即訪問修飾符)的,做相應(yīng)的方法或者屬性去間接的操作成員變量
※訪問修飾符
private 私有的? ? ? ? ? ? ? 只能在該類中訪問
protected 受保護(hù)的 ? ? ? 只能在該類和它的子類中訪問
public 公有的? ? ? ? ? ? ? ? 在任何地方都可以訪問
?
△封裝成員方法來間接操作類里面的成員變量
例:
?
class Ren{private string name;private int age; //年齡必須在18-50之間//取age的值public int GetAge(){return age;}//給age賦值public void SetAge(int a){if (age >= 18 && age <= 50){age = a;}else{age = 18;}}//取name的值public string GetName(){return name;}//給name賦值public void SetName(string n){name = n;}} View Code?
static void Main(string[] args){Ren r = new Ren();r.SetAge(8);r.SetName("張三"); //將’張三‘賦值給成員nameConsole.WriteLine(r.GetAge+r.GetName);Console.ReadLine();} View Code△使用成員屬性來間接訪問類里面的成員變量
定義變量的時(shí)候最好用_下劃線開頭
選中要做的成員變量右鍵→重構(gòu)→封裝字段(ctrl+r,e)
? ? ? 自動(dòng)生成的代碼不是成員變量也不是成員方法 ?是成員屬性
? ? ? 造好之后可以通過成員屬性操作成員變量
例:
class Student{private string _Name;public string Name{get { return _Name; }//簡(jiǎn)化的方法set { _Name = value; }}private int _Age;public int Age {get { return _Age; }set {if (value >= 18 && value <= 50){_Age = value;}else{_Age = 18;}}}private string _Sex;public string Sex {get;set;}//簡(jiǎn)寫 缺點(diǎn):不能控制值,不能用于構(gòu)造函數(shù)} View Code static void Main(string[] args){Student s = new Student();s.Name="趙四";s.Sex="男";s.Age=19;Console.WriteLine(s.Sex+s.Name+s.Age);Console.ReadLine();} View Code構(gòu)造方法(函數(shù)):
作用:造對(duì)象所要調(diào)用的方法,用來創(chuàng)建對(duì)象
? ?每一個(gè)類都有一個(gè)構(gòu)造方法,不寫也有只不過看不到而已
特殊性:寫法特殊 (方法名=類名;沒有返回值)
?執(zhí)行時(shí)間特殊(創(chuàng)建對(duì)象時(shí)執(zhí)行)
用途:可以對(duì)成員進(jìn)行初始化
舉個(gè)例子:
class Student{public Student(string s,string n){_Sex = s;_Name = n;}} View Code?
static void Main(string[] args){Student s = new Student("男","張三");//new Student()就是調(diào)用了一個(gè)方法 Console.WriteLine(s.Sex+s.Name);Console.ReadLine();} View Code舉個(gè)栗子:使用面向?qū)ο髞砬髢蓚€(gè)圓之間的面積
class Program{static void Main(string[] args){Yuan y1 = new Yuan();y1.R = 10;Yuan y2 = new Yuan();y2.R = 5;double cha = y1.mianji() - y2.mianji();Console.WriteLine(cha);Console.ReadLine();}}class Yuan{private int r;public int R{get { return r; }set { r = value; }}public double mianji(){return r * r * 3.14;}public double zhouchang(){return 2 * r * 3.14;}} View Code函數(shù)重載:
函數(shù)重載需要的條件:函數(shù)名要相同,參數(shù)的個(gè)數(shù)或者參數(shù)的類型不同
this關(guān)鍵字:
雖然寫在類里面,但不是屬于類的,而是屬于該對(duì)象的
一般來說在類里面 this關(guān)鍵字是可以省略的,但是如果有一個(gè)方法形參名字和成員名字重復(fù),這時(shí)候再調(diào)用該對(duì)象里面的成員的時(shí)候需要加this關(guān)鍵字
is關(guān)鍵字: 判斷變量是不是屬于某個(gè)類型
例:if (y2 is Ren)
??? {
???????????????? s = "是一個(gè)人";
??? }
??? else
??? {
??????????????? s = "不是一個(gè)人";
??? }
as關(guān)鍵字: 轉(zhuǎn)換類型(只能轉(zhuǎn)換兼容類型,可以將子類對(duì)象轉(zhuǎn)換為父類對(duì)象)
二、繼承
子類可以繼承父類的一切
特點(diǎn):單繼承 ??一個(gè)子類只能有一個(gè)父類? 一個(gè)父類可以有多個(gè)子類
C#特殊點(diǎn):所有類的祖先都是object
base關(guān)鍵字:在子類中代表父類對(duì)象,用法和this關(guān)鍵字相同 ?
???????????????????如果父類有構(gòu)造方法,那么子類也要有構(gòu)造方法,如果父類構(gòu)造需要參數(shù),那么子類構(gòu)造也必須有相應(yīng)的參數(shù)。 ?
???????????????????子類構(gòu)造后面可以通過base調(diào)用父類的構(gòu)造方法 ?
?????????????????? public China(string m):base(m) {}
class Program{static void Main(string[] args){China c = new China("zs");Console.WriteLine(c.Eat());Console.ReadLine();}}class Ren{private string _Name;public string Name{get { return _Name; }set { _Name = value; }}private int _Age;public int Age{get { return _Age; }set { _Age = value; }}//父類的構(gòu)造方法public Ren(string n){_Name = n;}public string Speak(){return _Name+"人類正在講話";}}class China:Ren{public China(string m):base(m){}public string Eat(){return base.Name+"用筷子吃飯";//return base.Speak(); }}class America : Ren{public America(string m): base(m){}public string Eat(){return "用刀叉吃飯";}} View Codesealed關(guān)鍵字:
密封類 該類不可以被繼承
sealed class 類名
{
}
部分類:partial
可以將一個(gè)類拆分成多個(gè)部分,分別放在多個(gè)文件內(nèi)
調(diào)用需要namespace相同,或用use引用
namespace 命名空間 相當(dāng)于虛擬文件夾
partial class 類名 ? //拆分的類均加partial
{
}
三、多態(tài)
1.編譯多態(tài)
函數(shù)重載
2.運(yùn)行多態(tài)
概念:當(dāng)父類引用指向子類實(shí)例的時(shí)候,由于子類對(duì)父類的方法進(jìn)行了重寫,在調(diào)用該方法的時(shí)候表現(xiàn)出的不同就稱為多態(tài)
條件:必須要有繼承? 父類引用指向子類實(shí)例? 子類必須對(duì)父類的方法進(jìn)重寫
里氏代換原則:如果有一個(gè)地方需要使用到父類對(duì)象,那么你可以將一個(gè)子類對(duì)象給他
class Program{static void Main(string[] args){DongWu dw = new Dog(); Dog d = new Dog();Console.WriteLine(Ceshi(dw));Console.WriteLine(CeShi(d));Console.ReadLine();}public static string CeShi(DongWu d){return "ok";}}class DongWu{public virtual string Eat() //虛方法 {return "該動(dòng)物在吃飯";}}class Dog:DongWu{public override string Eat() //重寫 {return "狗正在吃骨頭";}}class Cat : DongWu{public override string Eat(){return "貓正在吃魚";}} View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/H2921306656/p/5794359.html
總結(jié)
以上是生活随笔為你收集整理的面向对象(二)——三大特性(封装、继承、多态)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机技术与传感技术的关系,现代传感技术
- 下一篇: android网易云音乐api调用,网易