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
{
    //成员不允许添加访问修饰符,默认就是public
    string 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("错误"); //抛出异常
}
时间: 2024-10-13 10:57:44

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

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

1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关E

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM,字节码 两个命令: javac helloworld.java:将Java文件编译为字节码的.class文件 java helloworld:运行Java程序...??暂时这么认为 数据类型: 普通数据类型:int a=3; 对象数据类型:使用关键字new,String s=new String("

面向对象的三大特性---封装继承多态

面向对象的三大特性---封装继承多态 首先我们来创建一个控制台程序 新建一个父类Person 创建一个子类继承父类Person 子类: main函数: 输出结果: 根据结果显示创建子对象,首先调用父类的构造函数在调用子类的构造函数. 继承的传递性 例如: A:B,B:C,则A:C ⅰ.继承过来之后被隐藏,有意隐藏加一个关键字"new",如果加了关键字"new",就告诉子类,父类里面的sayHi只能被隐藏,不能被覆写  ⅱ.继承过来之后被覆写/重写,覆写需要在父类里面

类与对象 面向对象和面向过程对比 面向对象三大特征:封装 继承 多态

 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大象, 第三步, 关门 面向对象:大象, 你进冰箱. 此时主语是大象. 我操纵的是大象. 此时的大象就是对象 1. 面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤, 即, 先?干什么, 后干什么. 基于该思想编写程序就好比在编写一套流水线. 是一种机械 式的编程

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

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ? 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基类或超类,新建的类称为派生类或子类. ? 在Python中实现继承非常简单,在声明类的时候,在类名后面添加一个小括号,就可以完成继承关系.单纯的从代码的层面上来看当两个类具有相同的功能或者特征的时候就可以使用继承.提取一个父类,这个父类中编写者两个类相同的部分,然后两个类分别去继承这个类就可以

面向对象三大特性(封装/继承/多态)

引入:在面向对象思想中,有三大特性,封装  继承  多态. 思考:我们在使用类和对象实现编程的时候,到底是遵循这什么样的逻辑呢?为什么要这样规范类呢? 引入:面向对象很重要的思想就是隐藏,即外部不知道类内部是如何实现业务逻辑的,只管调用和使用结果,这个就是面向对象三大特性之一:  封装 1.封装[掌握] 定义:封装,字面意思就是将内容装到某个容器中,并进行密封保存,在面向对象思想中,封装指数据和对数据的操作捆绑到一起,形成 对外界的隐藏,同时对外提供可以操作的接口. 1.数据:即要操作的数据,在

封装继承多态到底讲的是什么

封装继承多态到底讲的是什么 封装.继承.多态并不是针对C#语言提出来的,他是一个在面向对象思想下产生的一个概念.所以想要弄明白封装.继承.多态,首先就要先了解面向对象概念. 封装:当我们提及面向对象的时候,这个对象怎么来?就是通过我们人为的封装得来.封装就是把一些特征或功能组合到一个抽象的对象上.就比如说电脑:它的特征是有一个显示屏,有一个主机,有鼠标和键盘等等.功能有计算等.那我们把这些特征和功能组合到“电脑”这个抽象的名词上时,“电脑”于是就有了这些特征和功能.但这个“电脑”不是实物,它代表

三大特性:封装,继承,多态

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础. 三大特性是:封装,继承,多态 所谓封装: 也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体.在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问.通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对

使用java中,面向对象封装+继承的方法算题

1.第一种:给定一行字符,逆序输出此字符串(空格.数字不输出),如"ab 23,(4 cd"输出"dc(,ba".(要求:使用面向对象封装+继承) class Bu { private String str; public Bu(){} public Bu(String str){ this.str = str; } public String getStr(){ return str; } public void setStr(String str){ this.