天天看點

C1第 1 節: 面向對象類的介紹和繼承

第 1 節: 面向對象類的介紹和繼承

1、字段和屬性可以看成是。這個對象的特征;

2、如果出現了曲線錯誤提示,滑鼠放在那裡,點選F6(或者等片刻);

3、子類預設調用父類無參數的構造函數,如果父類中沒有預設的無參數的構造函數,需要手動添加無參數的構造函數;

4、子類也可以調用父類的有參數的構造函數,利用:base();

public Student(string name, int age ):base(name,age)//可以先寫半個括号,就會有自動提示了。。

{

}

public Student(string name, int age ):base(name,0)//0表示預設的值,引用父類的名字屬性

{

}

C1第 2 節封裝繼承多态介紹

第 2 節封裝繼承多态介紹

1、子類不可以調用父類中的構造函數,而且,子類如果調用的話,也隻能調用父類中的預設的構造函數。

C1第 3 節: 虛方法和抽象方法

第 3 節: 虛方法和抽象方法

1、如果一個類(假設為A)繼承了一個抽象的類(假設B),那麼抽象類(B類)中的方法,必須在該類(A類)中進行重寫;

2、如果一個類含有抽象方法,那麼他就是抽象的類;

3、抽象類中的抽象方法是沒有主體的,即不能加 “{ }”花括号的:切記!隻加分号即可;

關于虛方法需要注意的幾點:

1、父類中如果有方法需要讓子類重寫,則可以将方法标記為virtual;

2、虛方法在父類中必須有實作,哪怕是空的實作;///實作就是有花括号,并且花括号内有代碼。空的實作就是說隻加一個花括号就可以了

3、虛方法子類可以重寫(override),也可以不重寫;

關于抽象方法注意的幾點:

1、需要用abstract關鍵字标記;

2、抽象方法不能(在該抽象類中)【括号裡的内容是我加上的】有任何方法實作;//就是說沒有主體了。。也可以說不加花括号的,隻加分号就行了;

3、抽象成員必須包含在抽象類中;

4、由于抽象成員沒有任何實作,是以子類必須将抽象成員重寫;

5、抽象類不能執行個體化;

抽象類的作用:抽象類的作用就是為了讓子類繼承;

6、抽象類中可以包括抽象成員,可以包括有具體代碼的成員;

7、還有抽象方法不能用static修飾;

1 上機練習:
 2 [code]
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8 
 9 namespace Test__GaoJiPian__XuFangFa
10 {
11 class Program
12 {
13 static void Main(string[] args)
14 {
15 
16 // Animal animal = new Animal(); //抽象類是不能執行個體化的
17 //Cat cat = new Cat();
18 //cat.Show();
19 //Animal cat1 = new Cat();
20 //cat.Show();
21 Console.ReadKey();
22 }
23 }
24 /*
25 abstract class Animal//抽象類
26 {
27 public abstract void Show();//抽象方法 
28 //子類必須将抽象成員Show()方法重寫否則會報錯;
29 //錯誤    1    “Test__GaoJiPian__XuFangFa.Animal.Show()”無法聲明主體,因為它标記為 abstract    
30 //(((((類似于接口中定義的方法,就是都沒有花括号)))))
31 //{
32 // Console.WriteLine("我是抽象類Animal中的抽象方法;Show()");
33 //}
34 }
35 class Cat : Animal //Shift+Alt+F10(滑鼠點選Animal後按下)//目的是快速的實作抽象類中的Show()方法的重寫
36 {
37 public override void Show()
38 {
39 //throw new NotImplementedException();删除即可
40 Console.WriteLine("我是子類Cat重寫抽象父類Animal中的show()方法");
41 }
42 }*/
43 
44 
45 abstract class Animal//抽象類
46 {
47 public abstract void Show();//抽象方法 
48 public virtual void SaiHi() //抽象類中包括抽象方法,但是也包括其他的方法;但是抽象方法必須在抽象類中存在;;;;
49 {
50 }
51 }
52 abstract class Cat : Animal 
53 {
54 //子類中不寫任何的方法,前邊再加上關鍵字abstrct的話,實作了抽象子類不調用抽象父類中的抽象方法show()
55 }
56 }
57 [/code]           

複制

C1第 4 節: 接口

第 4 節: 接口

接口是多态的第三種形式;但一般優先考慮接口的使用;

接口 一般是用I開頭的 如:IFly;

接口的預設修飾符就是public;

接口比作一種規範,一種能力;

interface IFly

{

}

1.接口中隻能包含方法(屬性、事件、索引器也都是方法)

2.接口中的成員都不能有任何實作。

3.接口不能被執行個體化。

4.接口中的成員不能有任何通路修飾符。(預設為public)

5.實作接口的子類必須将接口中的所有成員全都實作。

6.子類實作接口的方法時,不需要任何關鍵字,直接實作即可。

7.接口存在的意義就是為了多态。

接口解決了類的多繼承的問題

以後體積龐大的問題。

顯示實作接口

1 上機練習:
 2 [code]
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8 
 9 namespace Test_GaoJipian
10 {
11 class Program
12 {
13 static void Main(string[] args)
14 {
15 Persons per = new Persons();//執行個體化persons
16 per.Say();//調用Persons類中的方法
17 // per.Fly();//調用IFly接口中的方法
18 // IFly abc = new IFly();//錯誤    1    無法建立抽象類或接口“Test_GaoJipian.IFly”的執行個體    
19 //接口也是一個抽象的似有的特殊的類;反編譯工具看出的
20 IFly abc = new Persons();//寫成這樣倒是沒有問題;;将接口IFly看做是父類
21 abc.Fly();
22 Console.ReadKey();
23 }
24 }
25 class Persons : IFly
26 {
27 private string Name;//Ctrl+R+E//可以快捷的将字段轉化為屬性//相當于女人比較輕松
28 
29 public string Name1//相當于男人,比較辛苦 
30 {
31 get { return Name; }
32 set { Name = value; }
33 }
34 
35 public void Say()
36 {
37 Console.WriteLine("我是人類中的Say()的方法");
38 }
39 
40 /*
41 public void Fly()//接口的方法實作在類中繼承實作
42 {
43 //throw new NotImplementedException();//删除即可
44 Console.WriteLine("我是“實作接口”Shift+Alt+F10中的接口中的方法");
45 }*/
46 
47 void IFly.Fly()//顯示的實作接口Shift+Alt+F10 //此語句前邊不加任何的關鍵字
48 {
49 //throw new NotImplementedException();删除即可
50 Console.WriteLine("我是“顯示的實作接口”Shift+Alt+F10中的接口中的方法");
51 }
52 }
53 
54 //定義接口
55 interface IFly
56 {
57 //public void Fly(); //錯誤    1    修飾符“public”對該項無效,前邊預設的修飾符是pubic
58 
59 void Fly(); //正确寫法
60 //{ }錯誤    1    “Test_GaoJipian.IFly.Fly()”: 接口成員不能有定義
61 }
62 
63 interface ISwim
64 {
65 void Swim();
66 }
67 }
68 [/code]           

複制

C1.NET進階第一章小總結:

C1第一章小總結:

五個通路修飾符,

1、private類中成員的預設通路修飾符( 一般用來修飾類中的成員,如果被修飾的話,那麼隻能在本類中可以通路,)。

2、protected 本類及子類中可以通路(在繼承中用。)

3、internal 目前程式集内部可以通路

4、protected internal目前程式集或子類中(不同程式集也可以通路)。

5、public 任何地方

6、字段和屬性及索引器,(字段封裝為一個屬性(屬性裡邊有讀和寫))(目的是為了友善外部類調用該字段)

private string name;//定義一個私有的字段,隻能在本類中使用

如果索引器不會寫,可以參考List<T>集合(轉到定義),它裡邊含有一個方法是索引器方法

1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 索引器
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Person p=new Person();
14 
15             Console.WriteLine("索引器的第一個值是"+"“" +p[0]+"”");
16             Console.WriteLine("索引器的第二個值是" + "“" + p[1] + "”");
17             Console.WriteLine("索引器的第三個值是" + "“" + p[2] + "”");
18             Console.ReadKey();
19         }
20     }
21     class Person
22     {
23         public string[] name = { "精鋼狼", "鋼鐵俠", "泰坦" };
24         public string this[int index]
25         {
26             get
27             {
28                 string str = "";
29                 switch (index)
30                 {
31                     case 0: str = name[0]; break;
32                     case 1: str = name[1]; break;
33                     case 2: str = name[2]; break;
34                 }
35                 return str;
36             }
37         }
38     }
39 }           

複制

7、添加引用和導入命名空間,其實并不一樣,添加引用是添加一個外部的類庫,導入命名空間直接導入就可以了

靜态類: 1、 Console,Convert,Math使用時是否需要執行個體化(不能執行個體化,反編譯工具看出來,Console是抽象的密封的類,抽象類不能執行個體化,密封類不能繼承)

2、聲明一個靜态字段都能在哪裡使用、 寫一個什麼樣的類把作為靜态的類來使用呢?

答:【1】寫了一個類,這個類中有很多的方法,但是這些方法不想被建立對象的方式(即使用關鍵字new)來使用,就可以将這個類加上關鍵字static 成為靜态的類; 【2】如果想調用一個類中的靜态的方法,那麼,需要用這個靜态方法所在的類名點出來這個靜态方法;(如果是在靜态方法本類中調用該靜态的方法,直接調用靜态方法即可!)

3、靜态類為什麼不能執行個體化不能繼承?

(以Console(靜态類)舉例子,反編譯工具,轉到IL選項看出來,Console是抽象的密封的類,抽象類不能執行個體化,密封類不能繼承)

原因: 1、靜态類不能被執行個體化:abstract

2、靜态類不能被繼承:sealed

3、sealed關鍵字,表示類不能被繼承。(密封類)

4,、string就是一個靜态的類。不能被繼承,也不能執行個體化;;;;