20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)
1:C#中的访问修饰符
public: 公共成员,完全公开,没有访问限制。
private: 私有的,只能在当前类的内部访问。
protected: 受保护的,只能在当前类的内部以及该类的子类中访问。
internal: 只能在当前项目中访问,在同一个项目中,internal和public的权限是一样的。
protected internal: protected + internal权限。
1.1:能够修饰类的访问修饰符只有两个: public / internal
1.2:接口中的成员不允许添加访问修饰符,默认是public
1.3:类中的成员不添加访问修饰符,默认是private
1.4:命名空间的成员不添加访问修饰符,默认是internal
2:继承(把这几个类当中重复的成员单独的拿出来封装成一个类,作为这几个类的父类)
我们可能会有一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类。
Student Teacher Driver 子类 / 派生类
Person 父类 / 基类
2.1:子类继承了父类,子类从父类继承过来什么?
子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。
2.2: Q:子类有没有继承父类的构造函数?
答:子类并没有继承父类的构造函数,但是,子类会默认调用父类无参数的构造函数,创建父类对象,让子类可以使用父类的成员。
解决方案:
1):在父类中重写一个无参数的构造函数。
2):在子类中显示的调用父类的构造函数,使用关键字:base()
2.3:继承的特性
1.继承的单根性: 一个子类只能有一个父类
2.继承的传递性:
2.4:查看类图
2.5:object是所有类的基类
2.6:new关键字
1):创建对象
2):隐藏从父类那里继承过来的同名成员(子类和父类具有相同名称的方法)
隐藏的结果就是:子类调用不到父类的同名成员。
2.7:里氏转换
1:子类可以赋值给父类(如果有一个方法需要一个父类作为参数,我们可以传递一个子类对象)。
2:如果父类中装的是子类对象,则可以将这个父类强制转换为子类对象。
2.7.1:子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。
2.8:is 和 as
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false。
as:表示类型转换,如果能够转换则返回对象的本身,否则返回一个null。
Ps: Q:代码中出现Error:可访问性不一致的原因
答:子类的访问权限不能高于父类,会暴露父类的成员
3:多态
3.1:实现多态的方法:
1):虚方法
将父类的方法标记为虚方法,使用关键字virtual,这个函数可以被子类重新写一遍(override)
2):抽象类
当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法
3):接口
3.2:抽象类
1.抽象成员必须标记为abstract,并且不能有任何实现。
2.抽象成员必须在抽象类中。
3.抽象类不能被实例化。
4.子类继承抽象类后,必须把父类中的所有抽象成员都重写。
(除非子类也是一个抽象类,则可以不重写)
5.抽象成员的访问修饰符不能是private
6.在抽象类中可以包含实例成员。
并且抽象类的实例成员可以不被子类实现
7.抽象类是有构造函数的。虽然不能被实例化。
8.如果父类的抽象方法中有参数,那么。继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数。
如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候,也必须要有传入返回值。
3.3:虚方法/抽象类/接口 何时用来实现多态
1:如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
2:如果父类的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。
3:几个对象没有共同的父类,但是有共同的行为。则可以使用接口实现
方法的签名:方法的返回值和参数
3.4:虚方法和抽象方法的比较
3.5:静态方法和实例方法(定义和调用)
3.6:设计模式
设计这个项目的一种方式 (简单工厂设计模式)
3.7:值类型在复制的时候,传递的是这个值得本身
引用类型在复制的时候,传递的是对这个对象的引用
3.8:序列化与反序列化
序列化:就是将对象转换为二进制
反序列化:就是将二进制转换为对象
作用:传输数据
[Serializable] 只有被Serializable标记的类才能被序列化
BinaryFormatter //序列化的类
class Person
{
private string _name;
private int _age; public string Name
{
get
{
return _name;
} set
{
_name = value;
}
} public int Age
{
get
{
return _age;
} set
{
_age = value;
}
}
} class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.Name = "ZhangSan";
p.Age = ; using (FileStream fsWrite = new FileStream(@"C:\Users\admin\Desktop\Serializable.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fsWrite, p);
}
Console.WriteLine("Serialize Success");
Console.ReadKey(); //using (FileStream fsRead = new FileStream(@"C:\Users\admin\Desktop\Serializable.txt", FileMode.OpenOrCreate, FileAccess.Read))
//{
// BinaryFormatter bf = new BinaryFormatter();
// Person pObj = (Person)bf.Deserialize(fsRead);
//}
}
}
序列化与发序列化
3.9:部分类 partial
3.10:密封类 sealed 不能被继承, 可以继承别的普通类
ToString(); 是Object的虚方法,子类可以重写父类的虚方法
3.11:接口
[public] interface I..able
{
成员;
}
不允许写具有方法体的函数,不允许有字段,接口中允许有自动属性
------------------------------------------------------------------
接口是一种规范
1:只要一个类继承了一个接口,这个类就必须实现这个接口中所有的成员
2:接口中的成员不能加"访问修饰符",接口中的成员访问修饰符为public,不能修改。
3:接口中只能有方法,属性,索引器,事件,不能有"字段"和构造函数。
4:接口与接口之间可以继承,并且可以多继承。
5:接口并不能去继承一个类,而类可以继承接口(接口只能继承于接口,而类既可以继承接口,也可以继承类)
6:实现接口的子类必须实现该接口的全部成员。
7:一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并且实现了接口IA,那么语法上A必须写在IA的前面。
8:class MyClass:A,IA {} 因为类是单继承的。
9:显示实现接口的目的:解决方法的重名问题
什么时候显示的去实现接口:当继承的接口中的方法和参数一模一样的时候,要使用显示的接口。
10:当一个抽象类实现接口的时候,需要子类去实现接口。
Ps: 面试题:C#中的接口和类有什么异同。
不同点:
不能直接实例化接口。
接口不包含方法的实现。
接口可以多继承,类只能单继承。
类定义可在不同的源文件之间进行拆分。
相同点:
接口、类和结构都可以从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口和类都可以包含事件、索引器、方法和属性。
基础知识:接口只能定义方法(只能定义行为,不能定义实现也就是字段),因为事件、索引器、属性本质上都是方法,所以接口中也可以定义事件、索引器、属性。
Ps:面试题:abstract class和interface有什么区别?
相同点:
都不能被直接实例化,都可以通过继承实现其抽象方法。
不同点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;
抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。
补充回答:讲设计模式的时候SettingsProvider的例子。
20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)的更多相关文章
- php中的访问修饰符 private、protected、public的作用范围
1. private 只能在类内部使用 2. protected 可以在类内部和继承类里使用.类外部不能使用[即实例化后的对象无法调用] 3. public 全部范围适用. 4.子类复写父类中的方法时 ...
- 分享知识-快乐自己:java 中的访问修饰符
1):Java中的访问修饰符: Java面向对象的基本思想之一是封装细节并且公开接口.Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节. 访问控制 ...
- this关键字、访问修饰符、super关键字
this关键字.访问修饰符.super关键字 Java关键字this只能用于方法方法体内,而且只能用在非静态方法内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个 ...
- .NET中的访问修饰符
.NET中一共有五种访问修饰符 分别是 public 公共的,访问权限最高的. private ...
- java中的访问修饰符
Java有四种访问权限,其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符.其中package代表缺省的访问权限,具体到代码中就是不写任何修饰符的 ...
- java中抽象类与接口中方法访问修饰符问题 (
1.抽象类中的抽象方法(其前有abstract修饰)不能用private.static.synchronized.native访问修饰符修饰.原 因如下:抽象方法没有方法体,是用来被继承的,所以不能用 ...
- JAVA中的访问修饰符和包
一.JAVA访问修饰符 访问修饰符,用来控制类中成员的可见性 有四个访问修饰符,分别是:default,private,public,protected 1.default(默认):默认权限,不用写的 ...
- c#中的访问修饰符Protected,privet ,public, internal,和internal protected
Protected,privet ,public, internal,和internal protected的区别 Private修饰的,只能值类内部使用,外部不可以使用,子类不能直接访问,但可以通过 ...
- java中的访问修饰符详解
主要讲述一下java中protected的修饰控制范围. 在叙述protected修饰符使用之前,先来说一下java,可以发现,开发java程序是一个时时刻刻都在编写类.开发类.定义类的过程.类里面可 ...
随机推荐
- TCP系列40—拥塞控制—3、慢启动和拥塞避免概述
本篇中先介绍一下慢启动和拥塞避免的大概过程,下一篇中将会给出多个linux下reno拥塞控制算法的wireshark示例,并详细解释慢启动和拥塞避免的过程. 一.慢启动(slow start) 一个T ...
- 个人作业4 alpha阶段 个人总结
一.个人总结 二.回答问题 三.再提问题 Q1:关于第三章过早优化 过早优化:既然软件是"软"的,那么它就有很大的可塑性,可以不断改进.放眼望去,一个复杂的软件似乎很多的模块都可以 ...
- Qt语言家(Qt Linguist)更新翻译报错-Qt5.9-MinGW
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt语言家(Qt Linguist)更新翻译报错-Qt5.9-MinGW 本文地址:h ...
- php mongodb扩展 其他扩展也类似
MongoDBPHP 扩展 本教程将向大家介绍如何在Linux.window.Mac平台上安装MongoDB扩展. Linux上安装 MongoDB PHP扩展 在终端上安装 你可以在linux中执行 ...
- C语言宏中"#"和"##"的用法
转自:https://www.cnblogs.com/hnrainll/archive/2012/08/15/2640558.html 在查看linux内核源码的过程中,遇到了许多宏,这里面有许多都涉 ...
- C#常见函数
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ASP.NET MVC 多语言解决方案
1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...
- error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
C编程老是遇到这个问题: 错误 error C2143: 语法错误 : 缺少“;”(在“类型”的前面) d:\kinectproject\ceshiglad\ceshiglad\shili.c ces ...
- Django 2.0 学习(11):Django setuptools
应用打包 当前状态的Python包与各种工具有点儿混乱,本结我们将学习使用setuptools来构建应用包.该工具是强烈推荐使用的打包工具,之后我们也会使用pip去安装和卸载它. Python打包指的 ...
- 前台界面(2)---CSS 样式
目录 1. 内联样式 2. 层叠样式表CSS 2.1. 类选择器 2.1.1. 颜色设置 2.1.2. 字号设置 2.1.3. CSS边框属性 2.1.4. 设置背景颜色 2.1.5. 设置布局边框 ...