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

面向对象多态

一、装箱和拆箱

装箱:将值类型转换为引用类型。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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql gui 分区_一文彻底搞懂MySQL分区

一.InnoDB逻辑存储结构首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。段段就是上图的segment区域,常见的段有数据段、索引段、回滚段等,在In…

js 获取域名_RapidDNS域名查询如何联动Goby

前言:http://RapidDNS.io 是一个秒级在线子域名和同IP域名的查询工具。目前拥有25亿条DNS记录,支持A、AAAA、CNAME、MX4种DNS记录类型。由于Goby程序对子域名收集方面不是很完善,这里特编写此插件作为其拓展。可以方便快速获取域名和ip地址信…

iOS 9应用开发教程之iOS 9新特性

iOS 9应用开发教程之iOS 9新特性 iOS 9开发概述 iOS 9是目前苹果公司用于苹果手机和苹果平板电脑的最新的操作系统。该操作系统于2015年6月8号(美国时间)被发布。本章将主要讲解iOS 9的新特性、以及使用Xcode 7.0如何编写一个简单的iOS 9的应用程序等内容…

python后端框架flask_Vue+Flask轻量级前端、后端框架,如何完美同步开发

导言我们的Vue2.0应用:简读-微信公众号RSS,即将进入后端开发。VueFlask作为轻量级前端、后端框架,非常适合组合起来快速开发。一个是js,一个是Python。Bonus:可以完美实现跨域调试,不需要JSONP,也不需要服务…

mysql查询错误_一个奇怪的MySQL查询错误

t_user表的phone_number字段是varchar(255)类型的,表示手机号,在查询某个手机号时,sql语句如下:SELECT phone_number FROM t_user WHERE phone_number 13400000000查询结果:phone_number---------------------------…

hdu 3308 线段树

输入一串数字&#xff0c;有两个操作&#xff1a;Q a b 查询a到b区间内严格递增子串的最大长度 &#xff1b; U a b 把第a位数字替换成b 。注意输入的编号是从0开始 解法&#xff1a;线段树维护区间的严格递增子串的最大长度即可。注意细节。 #include <iostream> #inclu…

kafka创建topic命令_0748-5.14.4-Kafka的扩容和缩容

​文档编写目的在Kafka集群资源使用已超出系统配置的资源时&#xff0c;或者有大量资源闲置造成资源浪费的时候&#xff0c;需要分别通过扩容Kafka和缩容Kafka来进行调整。本篇文章Fayson主要介绍如何进行Kafka的扩容和缩容&#xff0c;以及变更后的Kafka集群如何进行负载均衡的…

java 对话框 显示图片_Java对话框上显示图片

手掌心其实有很多种方法可以解决图片显示大小的问题:使用photoshop修改. 优点是可以节省系统资源, 显示图片的时候,不用做处理,缺点是需要了解ps的基本操作使用JDialog 自定义对话框. 优点 可以实现复杂的效果, 缺点,代码量比较多使用ImageIcon, Image 类 实现图片的缩放,. 优点…

class-dump获取iOS私有api

转自&#xff1a;http://blog.csdn.net/sunyuanyang625/article/details/41440167 获取各类iOS私有api 安装工具class&#xff0d;dump 资源地址http://download.csdn.net/detail/map625/8191343 运行class&#xff0d;dump并编译src项目 编译之后在produce中找到编译好的class…

python能开发什么产品_三周学 Python ?不,三周做个产品

我的同事在看到毫无开发经验的我用三周时间&#xff0c;不但从零基础用上了 Python&#xff0c;还做出了一个客户关系管理系统&#xff0c;强烈邀请我分享经验。惶恐&#xff0c;因为我并没有出色的智商&#xff0c;也没有觉得三周学 Python 是一个体现自己牛叉的事情(不少人可…

爬楼梯 java_Leetcode 70.爬楼梯(Java)

题目&#xff1a;假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;注意&#xff1a;给定 n 是一个正整数。示例 1&#xff1a;输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬…

WebView之2

首先需要添加权限&#xff1a; <uses-permission android:name"android.permission.INTERNET"/>   MainActivity: package com.wyl.webview;import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.vie…

火星云分发全网视频_好用的短视频一键分发软件,让工作效率提高10倍

随着近几年新媒体行业的高速发展&#xff0c;新媒体行业的红利也越来越来&#xff0c;也有越来越多的人想要享受到这波红利&#xff0c;于是不管是个人是企业都纷纷开始进入这个市场。不过也随之诞生了一系列麻烦繁琐的问题&#xff0c;如怎么持续创作内容&#xff0c;怎么花费…

java 采样_Java编程实现beta分布的采样或抽样实例代码

本文研究的主要是Java编程实现beta分布的采样或抽样&#xff0c;具体如下。本文将使用math3提供的工具包&#xff0c;对beta分布进行采样。如下程序是对alpha81&#xff0c;beta219的beta分布函数&#xff0c;进行抽样&#xff0c;共采样10000次。package function;/*** author…

树莓派 蓝牙音响_你应该拥有一个树莓派

为什么你应该拥有一个树莓派树莓派并不是极客的玩具树莓派可以用来做什么?它能实现的实在是太多了,最常见的比如自动化脚本 各种机器人bot: QQ/wechat/微博/facebook/telegram,IM结合爬虫 telegram的bot如今被黑产们结合比特币,做成了交易系统 使用宝塔linux面板,一键安装word…

训练集的识别率一直波动_机器学习验证集为什么不再有新意?

机器学习中&#xff0c;一般将样本数据分成独立的三部分&#xff1a;训练集、验证集和测试集。其中验证集在机器学习中所起到的作用是&#xff1a;开发模型总需要调节模型的参数&#xff0c;而整个调节过程需要在验证集数据上运行训练的模型&#xff0c;从而给出其表现的反馈信…

java写一个web聊天工具_javaweb写的在线聊天应用

写这个玩意儿就是想练练手&#xff0c; 用户需要登陆才能在线聊天&#xff0c;不要依赖数据库&#xff0c; 不需要数据库的操作&#xff0c; 所有的数据都是保存在内存中&#xff0c; 如果服务器一旦重启&#xff0c;数据就没有了&#xff1b;登录界面&#xff1a;聊天界面&…

python dataframe删除重复行_详解pandas使用drop_duplicates去除DataFrame重复项参数

Pandas之drop_duplicates&#xff1a;去除重复项方法DataFrame.drop_duplicates(subsetNone, keepfirst, inplaceFalse)参数这个drop_duplicate方法是对DataFrame格式的数据&#xff0c;去除特定列下面的重复行。返回DataFrame格式的数据。subset : column label or sequence o…

O-C相关-08-动态类型与静态类型

08-动态类型与静态类型 1, 什么是动态类型和静态类型 1) 动态语言 又叫动态编程语言&#xff0c;是指程序在运行时可以改变其结构&#xff1a;新的函数可以被引进&#xff0c;已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除…

python中numpy是什么_什么是NumPy?

本文是对官方文档的翻译&#xff0c;原文在此What is NumPy? - NumPy v1.14 Manual​docs.scipy.org以下开始正文。NumPy是Python的一个用于科学计算的基础包。它提供了多维数组对象&#xff0c;多种衍生的对象(例如隐藏数组和矩阵)和一个用于数组快速运算的混合的程序&#x…