第 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就是一個靜态的類。不能被繼承,也不能執行個體化;;;;