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就是一个静态的类。不能被继承,也不能实例化;;;;