第 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修饰;
代码语言:javascript复制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.接口存在的意义就是为了多态。 接口解决了类的多继承的问题 以后体积庞大的问题。 显示实现接口
代码语言:javascript复制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>集合(转到定义),它里边含有一个方法是索引器方法
代码语言:javascript复制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就是一个静态的类。不能被继承,也不能实例化;;;;