C#基礎-面向對象詳解


面向對象詳解

一.什么是面向對象

1>面向對象是一種程序設計思想

2>面向過程和面向對象是什么?

例如要把大象放冰箱怎么做?

面向過程:打開冰箱門->把大象扔進去->關上冰箱門(如下圖)

面向對象:兩個對象,大象和冰箱。大象有自己的固有屬性高和重量,還有兩個動作分別是進冰箱和出冰箱。冰箱也有自己固有屬性高和重量,動作也有開門和關門

 

 

區分:

1.面向過程是解決問題的常規思路,更加符合解決問題的想法,但是隨着步驟越來越多,就很難滿足需求了。

2.面向對象是把東西分拆為各個對象,每個對象完成自己的核心動作,分工合作,對象之間交互完成功能。

 

二.面向對象的三大特性

1.封裝
下面幾行代碼,就是封裝一個對象,描述的是一只大象,大象有一些特性(身高和重量)和行為(進冰箱或出冰箱)

 1   public class Elephant
 2     {
 3         public int Height = 0;
 4         public int Weigth = 0;
 5         public void IntoFridge()
 6         {
 7             Console.WriteLine("進冰箱");
 8         }
 9         public void OutFridge()
10         {
11             Console.WriteLine("出冰箱");
12         }
13     }

總結:

1>把數據和行為打包到class中,就叫封裝

2>封裝的好處有,數據安全,提供重用性,分工合作和方便構建大型復雜的項目


2..繼承

下面幾行代碼,就是實現了繼承,大象子類繼承了動物父類,其中完全一樣的特性(身高,體重)和行為(吃東西)放到父類中,這樣做的好處是可以去掉重復代碼

大象子類可以擁有動物父類的一切公開的屬性和行為,不管大象是否願意,它都必須擁有父類的公開東西。繼承也是實現多態的,接下來會講到。

 

 1     public class Elephant: Animal
 2     {
 3         //public int Height = 0;
 4         //public int Weigth = 0;
 5         public void IntoFridge()
 6         {
 7             Console.WriteLine("進冰箱");
 8         }
 9         public void OutFridge()
10         {
11             Console.WriteLine("出冰箱");
12         }
13         //public void CanEat()
14         //{
15         //    Console.WriteLine("我可以吃東西");
16         //}
17     }
18     public class Animal
19     {
20         public int Height = 0;
21         public int Weigth = 0;
22         public void Eat()
23         {
24             Console.WriteLine("我可以吃東西");
25         }
26     }

3.多態

1>說白了,可以理解為有相同的變量,相同的操作,但是不同的實現
2>多態種類包括:方法的重載;接口&&實現;抽象&&實現 ;繼承

例如下圖:都是實例化的Animal,都是調用的Eat方法,一個執行的是大象的吃方法,一個執行的是人的吃方法,這就可以理解為相同的變量,相同的操作,實現方式不同,這就是多態啦!是運行時多態(程序運行時,實現的多態)

 1 using System;
 2 
 3 namespace _002_Attribute
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             Animal animal = new Elephant();
10             animal.Eat(); 
11             Animal animal1 = new People();
12             animal1.Eat();
13             Console.Read();
14         }
15     }
16     public class Elephant : Animal
17     {
18         public void IntoFridge()
19         {
20             Console.WriteLine("進冰箱");
21         }
22         public void OutFridge()
23         {
24             Console.WriteLine("出冰箱");
25         }
26         public override void Eat()
27         {
28             Console.WriteLine("我是大象,我吃植物");
29         }
30     }
31     public class People : Animal
32     {
33         public override void Eat()
34         {
35             Console.WriteLine("我是人,我吃米飯");
36         }
37     }
38     public abstract class Animal
39     {
40         public int Height = 0;
41         public int Weigth = 0;
42         public abstract void Eat();//抽象方法,必須在抽象類中
43     }
44 }
View Code

4.抽象

面向對象說是有封裝,繼承,多態三大特性,也可以說成有四大特性,包括抽象,抽象也是很常見的。

1>抽象方法:子類都得有,實現方式不同,此時考慮用抽象方法。這里注意,抽象方法必須在抽象類中

1>抽象類:

         首先抽象類是父類,里面放得都是共有的東西;

         抽象類中有約束(抽象方法);

         抽象類是不能實例化,只能由實現抽象了的子類去實例化

         抽象類中,放的都是共有的東西

三.怎么選擇抽象類和接口(重點)

接口:約束
1>只能約束

2>特點是,多實現,更加靈活

3>語義方面有點像:can do,可以說“實現接口的子類 can do 接口約束”

4>有的子類有,有的子類沒有的情況,就要考慮用接口

抽象類:父類+約束

1>可完成通用的實現,只能單繼承

2>語義方面有點像: is a,可以說“子類is a 父類”

選擇接口還是抽象類的原則:子類都一樣的,放在父類;子類都有但是不同,放在父類抽象一下;有的子類有,有的子類沒有,那就用接口
一般情況,接口用的更多,因為接口更簡單靈活 除非有些共有的需要繼承,下面是一個小例子:

需求:門,有材質,貓眼,門鈴,開門(),關門(),煙霧報警();等。

請問:用面向對象的程序設計思想,怎么去封裝??(值得深思,希望能起到與一反三的效果)

 1     interface IExtend
 2     {
 3         string CatEye { get; set; }//貓眼  
 4         string Doorbell { get; set; }//門鈴
 5         void SmokeAlarm();//煙霧報警
 6 
 7     }
 8     public abstract class BaseDoor
 9     {
10         public string RawStock { get; set; }//材料
11 
12         //以下兩個開門和關門在父類用抽象,因為開關門的方式會有不同,有些門自動開關,有些需要人去開關
13         public abstract void Open();//開門
14         public abstract void Close();//關門
15     }

四.抽象方法和虛方法的區別

1>最本質的區別:虛方法帶有實現(方法體),可以被重載;抽象方法沒有實現

2>下面的例子,詳細說明了抽象方法和虛方法的用法,程序中做了很詳細的注釋,程序運行結果如下圖:

 

 1 using System;
 2 
 3 namespace _002_Attribute
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             //虛方法/抽象方法,程序編譯時候,左邊遇到virtual/abstract時,做個標記,等程序運行的時候,判斷右邊是否有override,如果有,就以右邊為准
10         
11             ParentClass parent = new Child();
12             parent.CommonMethod();//普通方法,父類為准;這個是編譯時確定的,特點是:效率高
13             parent.VirtualMethod1();//虛方法,子類沒重載,左邊為准
14             parent.VirtualMethod2();//虛方法,子類有重載,右邊為准;運行時確定,特點是為了靈活
15             parent.AbstractMethod();//抽象方法,右邊為准;運行時確定,特點是為了靈活
16             Console.Read();
17         }
18     }
19     public class Child : ParentClass
20     {
21         public override void VirtualMethod2()//子類重載了父類的 VirtualMethod2
22         {
23             Console.WriteLine("我是子類,重載虛方法2");
24         }
25         public override void AbstractMethod()
26         {
27             Console.WriteLine("我是子類,實現后的抽象方法");
28         }
29     }
30     public abstract class ParentClass
31     {
32         /// <summary>
33         /// 普通父類方法
34         /// </summary>
35         public void CommonMethod()
36         {
37             Console.WriteLine("我是父類,普通方法");
38         }
39         /// <summary>
40         /// 父類虛方法,必須包含實現,可以被重載
41         /// </summary>
42         public virtual void VirtualMethod1()
43         {
44             Console.WriteLine("我是父類,虛方法1");
45         }
46         public virtual void VirtualMethod2()
47         {
48             Console.WriteLine("我是父類,虛方法2");
49         }
50         /// <summary>
51         /// 我是抽象方法
52         /// </summary>
53         public abstract void AbstractMethod();
54     }
55 
56 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM