面向对象多态

一、装箱和拆箱

装箱:将值类型转换为引用类型。object o = 1;值类型给引用类型赋值

拆箱:将引用类型转换为值类型。int n = (int)o; 强制转换为值类型

满足条件:两种类型是否存在继承关系。

int n = Convert.ToInt32("12"); 未发生装箱或拆箱 。int存储在栈,string存储在堆

装箱或拆箱会影响程序运行事件。

二、面向对象多态

对象在调用同一个方法的时候表现出来多种状态。

1、虚方法

将父类的方法标记为虚方法使用关键字virtual,可以被子类重新写一遍

protected void Page_Load(object sender, EventArgs e)
{person[] p = new person[2];chinese p1 = new chinese();jpan p2 = new jpan();p[0] = p1;p[1] = p2;Response.Write(p[0].SayHi()); //调用的方法时取决于自己是什么对象Response.Write(p[1].SayHi());
}public class person
{public virtual string SayHi() //父类方法使用virtual表示该方法是虚方法
    {return "人类";}
}public class chinese : person
{public override string SayHi() //子类方法使用override表示该方法是重写虚方法
    {return "中国人";}
}public class jpan : person
{public override string SayHi() // override
    {return "日本人";}
}

2、抽象类

当父类中的方法不知道如何去实现的时候,可以考略将父类写成抽象类,将方法写成抽象方法。

使用abstract定义的类为抽象类,使用abstract定义的方法为抽象方法,抽象函数是没有方法体的。

抽象类无法实例化父类,直接实例化子类调用。

父类方法中有意义时使用虚方法,父类方法中方法无意义时使用抽象类。

protected void Page_Load(object sender, EventArgs e)
{//抽象类不能被实例化 只能实例化子类对象xingzhuang y = new yuan(5);double mianji = y.mianji();double zhouchang = y.zhouchang();Response.Write("半径为5的原型面积为:" + mianji + ",周长:" + zhouchang);xingzhuang ju = new juxing(10, 20);double mianji1 = ju.mianji();double zhouchang1 = ju.zhouchang();Response.Write("高为10的宽为20的矩形面积为:" + mianji1 + ",周长:" + zhouchang1);
}public abstract class xingzhuang //被标记为abstract的类称为抽象类
{public string Name { get; set; } //抽象类中可以包含实例成员,并且实力成员可以不被子类实现。public abstract double mianji(); //抽象方法必须标记为abstract,并且不能有任何实现,必须在抽象类中。public abstract double zhouchang(); //抽象成员的访问修饰符不能是private
}public class yuan : xingzhuang
{public double R { get; set; }public yuan(double r){this.R = r;}public override double mianji() //子类继承抽象类后必须把父类中所有抽象成员重写
    {return Math.PI * this.R * this.R;}public override double zhouchang() //子类继承抽象类后必须把父类中所有抽象成员重写
    {return 2 * Math.PI * this.R;}
}public class juxing : xingzhuang
{public double width { get; set; }public double height { get; set; }public juxing(double height, double width){this.height = height;this.width = width;}public override double mianji() //子类继承抽象类后必须把父类中所有抽象成员重写
    {return this.height * this.width;}public override double zhouchang() //子类继承抽象类后必须把父类中所有抽象成员重写
    {return (this.height + this.width) * 2;}
}

三、简单工厂设计模式

class Program
{static void Main(string[] args){while (true){Console.WriteLine("请输入要进入的磁盘");string path = Console.ReadLine();Console.WriteLine("请输入要进入的文件");string fileName = Console.ReadLine();FileFather f = getFile(fileName, path + fileName);f.OpenFile(); //打开一个文件取决于输入一个什么文件
Console.ReadKey();}}public static FileFather getFile(string fileName, string fullName) //简单工厂形式返回父类
    {string ext = Path.GetExtension(fileName);FileFather f;switch (ext){case ".txt":f = new txtPath(fullName);break;case ".jpg":f = new jpgPath(fullName);break;default:f = null;break;}return f;}
}public abstract class FileFather //抽象父类
{public string fileName { get; set; } //文件全路径public FileFather(string fileName) //构造函数 自己不能用
    {this.fileName = fileName;}public abstract void OpenFile(); //抽象方法
}public class txtPath : FileFather
{public txtPath(string fileName) //继承父类构造函数: base(fileName){}public override void OpenFile() //子类重写
    {ProcessStartInfo psi = new ProcessStartInfo(fileName);//使用进程打开指定文件Process pro = new Process();pro.StartInfo = psi;pro.Start();}
}public class jpgPath : FileFather
{public jpgPath(string fileName): base(fileName){}public override void OpenFile(){ProcessStartInfo psi = new ProcessStartInfo(fileName);Process pro = new Process();pro.StartInfo = psi;pro.Start();}
}

四、值传递和引用传递

值类型:int double char decimal bool enum struct 存储于栈

引用类型:string 数组 自定义类 集合 object 接口 存储于堆

值传递:int n1 = 10; n2 = n1; n2 = 20; 值类型在赋值的时候,传递的是这个值的本身,复制了一份。 p1 = 10 ; p2 = 20;

引用传递:p1.name = "3"; p2.name = p1.name; p2.name="4"; 引用类型在赋值的时候,传递的是这个值的引用,引用同一份,p1 p2 指向同一块内存。

五、序列化和反序列化

序列化:将对象转换为二进制

反序列化:将二进制转换为对象

作用:传输数据。

1、将这个类标记为可以被序列化 [Serializable]。

2、使用BinaryFormatter开始序列化对象。

protected void Page_Load(object sender, EventArgs e)
{//将P传输给对方电脑person p = new person();p.name = "张三";p.age = 18;p.gender = '男';using (FileStream sw = new FileStream(@"d:\11.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))//序列化到目标文件
    {//开始序列化对象BinaryFormatter bf = new BinaryFormatter();bf.Serialize(sw, p); //要被序列化的对象 sw.Write 自动完成
    }person per = new person();//接收对方发过来的二进制 反序列化对象using (FileStream sr = new FileStream(@"d:\11.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)){BinaryFormatter bf1 = new BinaryFormatter();per = (person)bf1.Deserialize(sr);}Response.Write(per.name + per.age + per.gender);
}[Serializable] //将这个类标记为可被序列化
public class person
{public string name { get; set; }public int age { get; set; }public char gender { get; set; }
}

六、部分类partial

局部类型允许我们将一个类、接口或结构分成好几个部分,分别实现在几个不同的.cs文件中

public partial class person
{
}
public partial class person
{
}

1)类型特别大,不宜放在一个文件中实现。

2)需要多人合作编写一个类。

七、密封类sealed

密封类用sealed修饰,不能被继承。因此,它也不能是抽象类。

重写ToString()

子类重写父类的虚方法

public override string ToString(){ return "sd";}

八、接口interface

接口是一种规范,是一个引用类型,因为继承只能继承一个,所以通过接口可以实现多重继承。

只要一个类继承了一个接口,这个类就必须实现接口的所有成员。

接口不能实例化,不能被new。

在声明接口成员的时候,不准为接口成员编写具体的可执行代码.

接口与接口之间可以继承,可以多继承,接口不能继承类。

接口成员不能有static、abstract、override、virtual修饰符,使用new修饰符不会报错,但会给出警告说不需要关键字new。

一个类继承了接口又继承了类,语法上必须先继承类,再继承接口

public interface IFly
{//成员不允许添加访问修饰符,默认就是publicstring name { get; set; } //接口可以有方法、属性、所引器。void Fly(); //不可以有方法体
}public class father
{}public class person : father, IFly //先写类 后写接口
{public string name { get; set; }public void Fly(){}
}

显示接口

//用来解决方法重名问题
class Program
{static void Main(string[] args){Ifly fly = new Birad();fly.Fly(); //接口的Briad bid = new Briad();bid.Fly(); //自己的
    }
}public class Birad : Ifly //鸟类继承接口ifly
{public string Fly() //类自己的方法
    {return "fly";}public string Ifly.Fly(){ //接口的方法return "ifly11111";}
}public interface Ifly //定义接口 fly方法
{string Fly();
}

九、异常与异常处理

try
{int number = 10; //可能出错的代码块
}catch (Exception ex)
{Console.WriteLine(ex.Message);//错误信息throw new Exception("错误"); //抛出异常
}

1、什么时候用虚方法实现多态?

  可以提取出一个父类,需要写出明方法时。
2、什么时候用抽象类实现多态?

  可以提取出一个父类,但是不知道具体怎么实现时。
3、什么时候用接口来实现多态?

  无法提取出一个父类,但是都有一个共同的行为,或者需要多重继承时。

转载于:https://www.cnblogs.com/baidawei/p/4702526.html

3、C#面向对象:封装、继承、多态、String、集合、文件(下)相关推荐

  1. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

  2. 面向对象封装继承多态五大基本原则魔法方法反射

    目录 面向对象 三大基本特征 五大基本原则 魔法方法 反射 面向对象 什么是面向对象 使用模板的思想,将世界万事万物使用对象来表示一个类型 面向对象和面向过程的区别: 面向对象的不就是使用程序处理事情 ...

  3. (十)Core Java 面向对象(封装,继承,多态,接口) -02 (96)

     目录 :        24 ). 面向对象(聚集关系) 25 ). 面向对象(子父类中变量的特点) 26 ). 面向对象(子父类中函数的特点-覆盖) 27 ).  面向对象(子父类中构造函数的特点 ...

  4. 猜丁壳(面向对象 封装 继承 多态)

    创建三个包: util包中的Constans是用来存储常量的: util包中的MyUtil是用来存储工具类的: service包中的Player定义玩家的共同属性及方法: service包中的Comp ...

  5. c语言编程 菲薄拉,C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  6. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  7. 面向对象 编程及面向对象三大属性:封装 继承 多态

    面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...

  8. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  9. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息

    编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...

  10. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

最新文章

  1. 1600802002
  2. 学点Webpack吧
  3. 智慧树omg期末测试答案_智慧树答案广告文案写作单元期末见面课知到章节测试答案...
  4. cmd背景换成老婆(冰冰)
  5. 单模单纤光纤收发器指示灯及故障问题详解
  6. php ajax 表格编辑,php ajax表格实时编辑 PHP Ajax实现表格实时编辑
  7. excel保存超过15位数据不变科学计数法的方法
  8. python与sap_Python结合SAP GUI Script操作sap的简易教程
  9. 头条 上传图片大小_【标签头条】北京市启用进口冷链食品追溯平台;全球包裹热潮助推标签业发展;数字水印实现大规模垃圾分类;安慕希的麻将酸奶包装好真实...
  10. SpringBoot+Vue表单文件上传
  11. 排序序列排序算法总结(二)——快速排序、归并排序
  12. java时间控件jar包_maven打jar包插件
  13. 23种设计模式-装饰模式
  14. ABAQUS中获取参考点时间-位移曲线
  15. Python】Scrapy抓取多玩Gif图片
  16. 腾达路由器电信宽带服务器无响应,腾达路由器连接上但上不了网怎么办 腾达路由器上不了网原因及解决办法【图文】...
  17. 英国帝国理工出品——SSIM对抗攻击
  18. JavaMail| Apache Commons Email介绍
  19. 安卓开发那些事(三)之淘宝联盟接入
  20. 以智能钻井为例,深度解析数字油田的智能化建设

热门文章

  1. Day 14 20190129 老男孩python学习第14天 内容整理
  2. 不同操作系统打开文件浏览器(资源管理器)的方式
  3. 读书笔记8-浪潮之巅(part3)
  4. Java内存模型_基础
  5. Tomcat服务器的安装及配置
  6. SWIFT推送之本地推送(UILocalNotification)之二带按钮的消息
  7. 项目开发--高级功能汇总
  8. SQL Server 自定义函数 返回树结构函数
  9. all()是python内置函数吗_Python内置函数all(),python
  10. javascript 将table导出 Excel ,可跨行跨列