首页 > 代码库 > 面向对象基础3(class0523)
面向对象基础3(class0523)
怎么实现多态2-接口
接口是定义一种能力,规定子类能干什么和抽象类有些相似,解决类的单根继承。接口可以实现多继承
案例
鸟-麻雀sparrow,鸵鸟ostrich,企鹅penguin,鹦鹉parrot
鸟能飞鸵鸟,企鹅不能。。。你怎么办
练习:从学生,老师,父类Person,定义一个接口摄影Iphotographable ,唱歌的接口ISingable
子类继承抽象类,实现接口
接口中的成员必须不能有实现
接口中的成员不能有访问修饰符,隐式公开
接口中可以有属性、方法、索引器等,但不能有字段,构造函数 接口中的所有程序必须被子类中全部实现
橡皮rubber鸭子、木wood鸭子、真实的鸭子duck。三个鸭子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不一样,橡皮鸭子“唧唧”叫,真实地鸭子“嘎嘎”叫,木鸭子不会叫
开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况
。 对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
什么时候使用抽象类,什么时候使用接口 抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
面试题
1. 如何使用virtual和override?
2. 如何使用abstract和override?
3. "重载" 、 "重写"、 "隐藏"是同一个概念吗?
4.抽象类和接口的区别
抽象类和接口的区别
接口定义类的公共能力,抽象类定义类的公共实现和公共的能力
一个类只能继承自一个类(抽象类),但是可以同时实现多个接口
接口中不能有实现,抽象类中可以有未实现成员也可以有实现的成员
接口中未实现的方法必须在子类中直接实现,抽象类中未实现的成员必须在子类中重写
好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。
如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
什么时候使用抽象类,什么时候使用接口
抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
类型转换CAST
隐式转换、显式转换。当目标类型一定能满足源类型转换过去后的要求的话就是隐式转换;如果当目标类型不一定能满足源类型转换过去后的要求的话就需要显式转换(程序员自己负责)。
例:double d = 5; int n = 6; double num = n;
把学生转换为人是隐式转换,把人转换为学生则是显式转换(强制转换)
Student s = new Student(); Person p =s; Student stu = (Student)p;
只有在内存存储上存在交集的类型之间才能进行隐式转换,不能用Cast,转换string/int,只能用Convert。Convert.ToInt32/Convert.ToString
类型转换Cast是在内存级别上的转换。内存中的数据没有变化,只是观看的视角不同而已
类型转换Convert
若要进行其它类型的转换可以使用Convert.ToInt32、Convert.ToString等。
Convert可以把object类型转换为其它类型 把字符串转换为整型时还可以使用int.Parse int.TryParse
string str= null;
int num= 0;
num = Convert.ToInt32(str);
Console.Write(num +“\r\n”);
num= Int32.Parse(str);
Console.Write(num +“\r\n”);
Int32.TryParse(str, out num);
Console.Write(num +"\r\n");
运行结果:Convert.ToInt32()在null时不抛异常而是返回0;Int32.Parse()要抛异常;Int32.TryParse()不抛异常,会返回true或false来说明解析是否成功,如果解析错误,调用方将会得到0值。效率Int32.TryParse()优于Int32.Parse()优于Convert.ToInt32()。因 为:Convert.ToInt32会把最终的解析工作代理给Int32.Parse,而Int32.Parse和Int32.TryParse则分别把 解析工作直接代理给Number.ParseInt32和Number.TryParseInt32,前者在出现解析错误时会抛出异常,而后者则仅仅返回 false。
异常处理
案例:
int x = 5;int y = 0;int z = x / y;
程序运行运行时出错,后续的内容无法运行
程序一旦有一个功能发生异常,整个程序崩溃其它功能也无法正常运行
try catch。Exception ex 异常也是对象。
Exception 类主要属性:Message、StackTrace
发生异常后程序默认就退出了,try代码块中的后续代码不会被执行。catch以后的代码则会继续执行。
扔出自己的异常,扔:throw,抓住:catch
1 try 用于检查发生的异常,并帮助发送任何可能的异常。 2 catch 以控制权更大的方式处理错误,可以有多个catch子句。 3 finally 无论是否引发了异常,finally的代码块都将被执行。 4 5 6 static void ProcessString(string s) 7 { 8 if (s == null) 9 { throw new ArgumentNullException();10 }11 } 12 static void Main() 13 { 14 try { string s = null; ProcessString(s); } // Most specific:15 catch (ArgumentNullException e) 16 { 17 Console.WriteLine("{0} First exception caught.", e); 18 } // Least specific:19 catch (Exception e) { Console.WriteLine("{0} Second exception caught.", e); } }
值类型 引用类型
画家画了两幅画
值类型均隐式派生自System.ValueType
数值类型、bool、结构、枚举
引用类型派生自System.Object
字符串、数组、类、接口等
引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
枚举 一组和数值有关的常量 enum Gender { Male,Female} enum Weeks { 星期日=0,星期一,} 把字符串转换成枚举Gender g = (Gender)Enum.Parse(typeof(Gender), "Male");结构 就是小类,值类型 不能继承类 隐式密封 可以实现接口 不能有显示无参构造函数(隐式) 结构中不能给字段赋初始值 如果使用构造函数初始化结构,必须在构造函数中给所有字段赋值
函数返回值(函数参数前的修饰符)
params 可变参数
ref 仅仅是一个地址,引用传递,可以把值传递强制改为引用传递
out 让函数可以输出多个值
ref必须先初始化,因为是引用,所以必须先“有”,才能引用,而out则是内部为外部赋值,所以不需要初始化,而且外部初始化也没用。
在方法中必须对out修饰的参数赋值 ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。
案例1:两个变量的交换
案例2:模拟登陆,返回登陆是否成功,如果登陆失败,提示用户是用户名错误还是密码错误
求数组中的最大值,最小值,平均值 用方法实现 让数组中的内容交换位置
常用类库
学习.net就是学习它的无数个类库怎么用,
先看两个简单的 String 字符串,不可变特性。
字符串可以看成字符数组
属性
Length
方法
IsNullOrEmpty()
静态方法
ToCharArray()
ToLower()
ToUpper()
Equals() 忽略大小写的比较
Join() 静态方法
Format () 静态方法
IndexOf()
LastIndexOf()
Substring()
Split()
Replace()
Trim()
作业:
1、要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机必须有扩展性,能与目前未知而以后可能会出现的存储设备进行数据交换。各个存储设备间读、写的实现方法不同,U盘和移动硬盘只有这两个方法,MP3Player还有一个PlayMusic方法
换成接口
2、猜拳游戏 + 枚举
3、求数组中的最大值,最小值,平均值 用方法实现
4、让数组中的内容交换位置
5、复习面向对象(主要是抽象类 面向对象计算器)