怎么实现多态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

 try 用于检查发生的异常,并帮助发送任何可能的异常。
catch 以控制权更大的方式处理错误,可以有多个catch子句。
finally 无论是否引发了异常,finally的代码块都将被执行。 static void ProcessString(string s)
{
if (s == null)
{ throw new ArgumentNullException();
}
}
static void Main()
{
try { string s = null; ProcessString(s); } // Most specific:
catch (ArgumentNullException e)
{
Console.WriteLine("{0} First exception caught.", e);
} // Least specific:
catch (Exception e) { Console.WriteLine("{0} Second exception caught.", e); } }

值类型 引用类型

画家画了两幅画

值类型均隐式派生自System.ValueType

数值类型、bool、结构、枚举

引用类型派生自System.Object

字符串、数组、类、接口等

引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

枚举
一组和数值有关的常量
enum Gender { Male,Female}
enum Weeks { 星期日=,星期一,}
把字符串转换成枚举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、复习面向对象(主要是抽象类 面向对象计算器)

面向对象基础3(class0523)的更多相关文章

  1. 了解JavaScript 面向对象基础 & 原型与对象

    面向对象语言中的对象 老是能听到什么基于对象, 面向对象. 什么是对象, 如果有面向对象基础的人可以无视了, 下面举个简单的例子给大家讲讲面向对象中, 对象的定义, 这个是比较通用的, 不过对于JS来 ...

  2. MYSQL、PHP基础、面向对象基础简单复习总结

    一.MYSQL         1.配置MySql                 第一步安装服务器(apache).                 第二部安装MySql界面程序         2 ...

  3. 从零开始学Python第六周:面向对象基础(需修改)

    标签(空格分隔): 面向对象 一,面向对象基础 (1)面向对象概述 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...

  4. python面向对象基础

    面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...

  5. java基础学习05(面向对象基础02)

    面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...

  6. java基础学习05(面向对象基础01--类实例分析)

    面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...

  7. java基础学习05(面向对象基础01)

    面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...

  8. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  9. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  10. 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder

    [重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder   1.String String是Java中的一个final ...

随机推荐

  1. MySQL查询本周、上周、本月、上个月份数据的sql代码(转)

    感谢:http://www.jb51.net/article/32277.htm ----------------------------------------------------------- ...

  2. [JavaScript] js验证身份证

    function checkIdCard(){     var vcity={11:"北京",12:"天津",13:"河北",14:&quo ...

  3. SAML - SSO(转)

    http://baike.baidu.com/view/758527.htm?fr=aladdin SAML即安全断言标记语言,英文全称是Security Assertion Markup Langu ...

  4. [转载]mongoDB学习笔记——存取图片(C#)

    作为一个NoSql数据库的代表,存取多媒体数据,应该是强项吧?那么,图片在mongoDB里是如何存取的呢?(其实,关系型数据库存取图片也一点问题没有,所以我看NoSql的强项不在于是否存储多媒体,而在 ...

  5. spoj 345

    DP  想了好久  还是看了一下题解.... f[i][j]表示i到j全部合并后的最小花费,f[i][j] = min{f[i][k]+f[k+1][j]+d[i][k]*d[k+1][j]} (i ...

  6. ural 1200

    推出公式  然后特判两端  代码其实挺烂      但是有人竟然可以直接暴过去的 ...... #include <cstdio> #include <cstring> #in ...

  7. 用Vue.js和Webpack开发Web在线钢琴

    缘起 由于童心未泯,之前在手机上玩过钢琴模拟App,但是手机屏幕太小,始终觉得不过瘾.其实对于我这个连基本乐理都不懂的"乐盲"来说,就算给我一台真正的钢琴,我也玩不转.不过是图个新 ...

  8. PHP 怎么随机获取数组里面的值

    注意array_rand随机返回的是KEY值的集合 <?php srand((float) microtime() * 10000000); $input = array("Neo&q ...

  9. ASP.NET 4.5.256 has not been registered on the Web server

    请见:http://answers.microsoft.com/en-us/insider/forum/insider_apps-insider_other/aspnet-45256-has-not- ...

  10. iOS开发的小技巧(断点打印)

    iOS开发中我们会碰到这样的需求:打印沙盒目录,打印对象信息,对象信息可以通过断点查看,有时候对象属性繁多时看起来又比较麻烦. 今天学到一个比较实用的方法: 在运行时打一个断点,当程序停在这个断点后, ...