1108-文件流、多态、设计模式、接口、序列化、索引器

 

1.文件流(操作文件有一个流程。从打开,到输入数据,到关闭之间有一系列的流程,这期间的操作叫做文件流)

  • 小文件用读写用File,大文件读写用FileStream
  • Stream(所有流的父类,是一个抽象类)
Filestream fs =File.Open();   //返回FileStream
  • 文件操作的类都在Systm.IO;
  • 用Using,就不用释放文件,关闭文件操作了,内包含了
using(FileStream fs=new FileStream(path,FileMOde.Open,FileStream.Read,FileShare.Read))//读大文件

 读大文件代码

 using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))   //因为要操作文件,需要一个流程,所以在这里面写下流程,使用using的好处是不用写释放文件和关闭文件,因为它是自动关闭的
            {
                using (StreamReader sr = new StreamReader(fs, Encoding.Default)) //实例化这个,然后用ANSI方式读取
                {
                    while (!sr.EndOfStream)           //如果这个流不是在末尾就执行下列代码
                    {

                        Console.WriteLine(sr.ReadLine());   
                    }
                    //Console.WriteLine(sr.ReadLine());         //读一行,经常使用这个,因为修改内容好修改
                    Console.WriteLine(sr.ReadToEnd());          //读到文件中内容的最后
                }
                Console.ReadKey();

 写大文件代码

 //写入大文件
                string path = @"F:\提高班\项目\计算机项目\vb项目\CS学习\02 C#\文件练习文件夹\读大文件练习\大文件.txt";

            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.Write))
            {
                using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                {
                    sw.Write("哈哈");     //这个写入会覆盖掉原来的相同下标的文字
                }
                Console.ReadKey();
            }

多态

第一种(隐藏基类方法与多态的实现)

(多个对象可以表现多个类型的能力--例如人类会说话say,但是老师说的话和学生说的话不一样,可以用多态实现,不同人说不同的话,不同的人还能做不同的运动,在运动中又有不同的技巧)

重写:不同对象对于同一个方法调用的不同行为(指不同对象收到相同消息时,会产生不同行为)

虚方法:用virtual修饰的方法叫做虚方法,虚方法可以在子类中通过override关键字来重写,常见虚方法:ToString()Equals

所有类的方法都是object,例如person后面没有写继承的父类,但是默认的父类为object类

  • 子类可以有与父类方法名相同的方法
    • 签名不同(重载不同)
    • 签名相同(隐藏基类方法)
  • 子类可以重写父类方法
    • 虚方法
    • 重写方法
    • 重写积累方法一样可以调用基类方法

隐藏基类的方法

1.可以在子类方法的修饰符后面加new可以解决(重新实例化了)

public class person           //重新实例化了此方法
    {
        
        public  void say()       
        {
            Console.WriteLine("我是人");
        }
    }
    public class student:person
    {
        public new void say()
        {
            Console.WriteLine("我是老师");
        }
    }

2.可以在父类的方法的修饰符后面加 Virtual(虚方法),在子类中方法的修饰符后面加override(重写父类的方法)

 public class person           //根据具体的人用同样的方法,显示不同的内容
    {
      
        public virtual void say()       
        {
            Console.WriteLine("我是人");
        }
    }
    public class student:person
    {
        public override void say()
        {
            Console.WriteLine("我是老师");
        }
    }

虚方法与重写

1.方法不能用static修饰

2.方法重写与基类的签名必须一致

3.virtual不能与private一起使用

第二种(抽象方法与抽象类)

  • 抽象类与抽象方法有abstract修饰
  • abstract的使用注意
    • 抽象方法没有方法体
    • 抽象成员只能存在于抽象类中
    • 抽象类可以有非抽象成员
    • 抽象类的派生类必须实现抽象方法体
    • 抽象类只能用作基类,无法实例化

抽象方法与抽象类代码

 public abstract  class Animal              //抽象类
    {
       
        public abstract void Shout();        //抽象方法,没有方法体
       
    }

虚方法和抽象方法比较

虚方法抽象方法
用virtual修饰用abstract修饰
要有方法体不允许有方法体
可以被子类override必须被子类override
处理密封类都可以写之恩呢在抽象类中

多态小结:

几种建立多态的方式

  • 用父类实现多态
  • 用抽象类实现多态
  • 用接口实现多态

版本控制

  • 需要保留基类方法使用new关键字
  • 需要重写方法时使用override关键字

设计模式

(设计模式时软件开发过程中经验的基类,根据特定问题可以找到很好的特定解决方法,可以省去很多反复的工作)

 

接口

  • 定义:interface关键字,接口中可以有属性、方法(未实现)
  • 街廓的名称通常以“I”开头,入IList
  • 如果一个类即继承了类又实现了接口,那么类必须写在前面
  • 一个类只能继承一个父类,但可以实现多个接口
class Student:Person,Iwalk,Isay,Imove
  • 接口是一种完全抽象的一种约定,接口就是用来实现的,不用就不要定义接口,实现也必须在一定的范围内使用
  • 实现接口,不能说继承接口
  • 代码例子
namespace 接口          //先添加个接口,在接口窗口中写入接口
{
    interface IFly
    {
        void IFly();
    }
    
}
class Program
    {
        static void Main(string[] args)
        {
            IFly ifly = new Teacher();     
            ifly.IFly();                   //调用ifly的IFly方法
            Console.ReadKey();
        }
    }
    public class person
    {
        
    }
    public class Teacher:person,IFly
    {
        public void Say()
        {
            Console.WriteLine("我是老师");
        }
        public void IFly()                 //接口方法的具体实现
        {
            Console.WriteLine("我会飞");
        }
    }

C#中的接口和类有什么异同点

不同点:

  • 不能直接实例化接口(?)
  • 接口不包含方法的实现
  • 接口可以多继承,类只能单继承
  • 类定义可在不同的源文件之间进行拆分

相同点

  • 接口、类和结构都可以从多个接口继承
  • 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员
  • 接口和类都可以包含事件、索引器、方法和属性

 

C#支持多重继承么?

类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。类是爹,接口是能力,能力有多个能力,但不能有多个爹

 

抽象类和接口有什么区别?

相同点:

都不能被直接实例化,都可以通过继承实现其抽象方法

不同点:

接口支持多继承;丑行类不能实现多继承

接口只能定义行为;抽象类既可以定义行为,还可能提供实现

接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。

接口值包含方法,属性,索引器,事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法

接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Strct就可以继承接口,而不能继承类;

 

装箱与拆箱

装箱:值类型变成引用类型

拆箱:引用类型变成值类型

 

序列化

将所有数据都转换为了二进制

异常处理

int num = 10;
            Console.WriteLine("输入数字");
            try
            {
                int numbner = Convert.ToInt32(Console.ReadLine());
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();

索引器

  • 为了方便将类、结构或接口当作数组来使用
  • 索引器用于封装内部集合或数组
  • 索引本质就是属性
  • 利用索引可以用key得到项,亦可用项得到序号

 

静态方法和实例方法(定义和调用)

静态实例(非静态)
static关键字不需要static关键字
使用类名调用使用实例对象调用
在静态方法中,可以访问静态成员在实例方法中:可以直接访问静态成员
在静态方法中,不可以直接访问实例成员在实例方法中:可以直接访问实例成员
调用前初始化实例化对象时初始化

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值