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

时间:2023-01-26 18:36:24

面向对象多态

一、装箱和拆箱

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

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

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

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

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

二、面向对象多态

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

1、虚方法

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

3、C#面向对象:封装、继承、多态、String、集合、文件(下)
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 "日本人";
}
}
3、C#面向对象:封装、继承、多态、String、集合、文件(下)

2、抽象类

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

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

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

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

3、C#面向对象:封装、继承、多态、String、集合、文件(下)
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;
}
}
3、C#面向对象:封装、继承、多态、String、集合、文件(下)

三、简单工厂设计模式

3、C#面向对象:封装、继承、多态、String、集合、文件(下)
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();
}
}
3、C#面向对象:封装、继承、多态、String、集合、文件(下)

四、值传递和引用传递

值类型: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开始序列化对象。

3、C#面向对象:封装、继承、多态、String、集合、文件(下)
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; }
}
3、C#面向对象:封装、继承、多态、String、集合、文件(下)

六、部分类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。

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

3、C#面向对象:封装、继承、多态、String、集合、文件(下)
public interface IFly
{
//成员不允许添加访问修饰符,默认就是public
string name { get; set; } //接口可以有方法、属性、所引器。
void Fly(); //不可以有方法体
} public class father
{ } public class person : father, IFly //先写类 后写接口
{
public string name { get; set; }
public void Fly()
{
}
}
3、C#面向对象:封装、继承、多态、String、集合、文件(下)

显示接口

3、C#面向对象:封装、继承、多态、String、集合、文件(下)
//用来解决方法重名问题
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();
}
3、C#面向对象:封装、继承、多态、String、集合、文件(下)

九、异常与异常处理

3、C#面向对象:封装、继承、多态、String、集合、文件(下)
try
{
int number = 10; //可能出错的代码块
} catch (Exception ex)
{
Console.WriteLine(ex.Message);//错误信息
throw new Exception("错误"); //抛出异常
}

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

  1. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  2. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  3. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  4. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  5. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  6. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  7. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  8. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  9. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  10. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

随机推荐

  1. python_way,day4 内置函数(callable,chr,随机验证码,ord),装饰器

    python_way,day4 1.内置函数 - 下 制作一个随机验证码 2.装饰器 1.内置函数 - 下 callable() #对象能否被调用 chr() #10进制数字对应的ascii码表中的内 ...

  2. 【jmeter】JMeter处理Cookie与Session

    有些网站保存信息是使用Cookie,有些则是使用Session.对于这两种方式,JMeter都给予一定的支持. 1.Cookie 添加方式:线程组-配置元件-HTTP Cookie 管理器,如下图: ...

  3. Repair the database using DBCC CHECKDB

    So now if you want to place AdventureWorks2008R2 sample database in a single-user mode, then write t ...

  4. 安装apache服务出错,无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题

    错误信息:无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题 错误场景:在使用["D:\Program Files\httpd-2.4.20-x ...

  5. 《学习记录》ng2-bootstrap中的component使用教程

    前序: 现在angular2已经除了集成的angular-cli,建议大家可以基于这个来快速开发ng2的项目,不用自己再搭建环境: 相关内容请前往:https://angular.cn/docs/ts ...

  6. Spring3 MVC DispatcherServlet 配置问题

    1. Spring MVC 是通过servlet来进行转发的,一般在web.xml中配置如下: <servlet> <servlet-name>dispatcher</s ...

  7. Treats for the Cows

     Treats for the Cows Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64 ...

  8. DAY12、装饰器

    一.补充:nonlocal关键字 1.作用:将L与E(E中的名字需要提前定义)的名字统一 2.应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值 3.案例: def outer():    ...

  9. Docker 部署应用、jar 工程 docker 方式部署

    https://blog.csdn.net/jiangyu1013/article/details/81988342

  10. node 慕课笔记

    global global.testVar2 = 200; 在别的文件中可以任意调用到 因为global是全局变量相当于js的window一样的