C#面向对象的一些东西
最近在复习C#面向对象,也就是说常说的3大特性:封装、继承和多态。首先说一下封装,其实封装最大的目的也是为了实现代码的解耦和重用、代码也是安全的(对外它隐藏了具体的实现,就好比我们拿个遥控器就能操作电视机,而无须知道其内部实现);C#中很多地方都用到了封装,可以将一个具体的功能代码封装成一个方法,供外界调用就是一个封装。
再说一下继承吧。首先要搞明白的是,继承是类与类之间的关系,那么必然有一个父类,一个子类(可以理解为父亲和儿子的关系),父类是相对子类更抽象的类,而子类是相对父类更具体的类(可以理解为父类能做的事儿,子类继承后都可以做,这里有一个特例,父类如果将一个方法或字段设为Sealed,私有的,子类是继承不到的;而子类能做的事儿,父类不一定能做,即在子类中新增的方法),C#有2种继承,体现为父类中有虚方法(virtual)、父类是抽象类(abstract),这2种都可以供子类继承,根据2种实现时语法上的不同,他们的区别是:
1.如果一个需求是很模糊,很广泛的,这是考虑抽象类,而不是虚方法。
2.如果一个父类要求有代码实现,那么就必须用虚方法,因为抽象方法是不允许有代码实现的;
3.如果强制要求一个子类必须实现父类中的方法,那么父类必须用抽象类,如果没有这样的要求,那么父类可以用虚方法;
4.抽象类不能被实例化(但可以有构造函数),可以有实例成员也可以有抽象成员。
需要说明的是,假如父类是抽象类,而如果子类也不想实现父类的方法,只要子类也是抽象类即可,这样以来,实现的代码就交给子类的下一代(个)子类来实现。
判断继承关系:
子类 is (a) 父类;
转换,子类 as 父类。(这个方法转换成功,返回父类对象;转换失败,返回null)
继承的好处:
1.代码重用;
2.继承就是为了实现多态而准备的,多态就是一个类的多种状态(说的很模糊);这里提到一个概念,叫“里氏替换原则”,父类变量指向子类对象。多态的目的是,为了程序的可扩展性(开放封闭原则,对修改封闭,对扩展开放);下面用一个具体实例说明问题:
需求是,要实现一个计算器,要求不论多复杂的算法,调用者只需要掉“计算”这个方法就能得到自己想要的结果,而且计算方法还会不断地扩展。这个时候考虑虚方法是不行的,因为虚方法有代码实现,所以采用抽象类是最合适不过的。抽象类的代码如下:
public abstract class Calculator
{
public int Number1
{
get;
set;
}
public int Number2
{
get;
set;
}
//2个构造函数
public Calculator()
{
}
public Calculator(int n1,int n2)
{
this.Number1 = n1;
this.Number2 = n2;
}
public abstract int Jisuan();
}
再定义一个类库,里面的类来实现上面这个类即可(如果上面的类在另外一个类库中,注意引用)。举例:加法
public class AddFa : Calculator
{
public AddFa(int n1,int n2):base(n1,n2)
{
}
public override int Jisuan()
{
return Number1 + Number2;
}
}
这个时候,用一个控制台来测试上面的加法类:
static void Main(string[] args)
{
Console.WriteLine("请输入第一个数:");
int number1 = int.Parse(Console.ReadLine());
Console.WriteLine("请输入操作符:");
string op = Console.ReadLine();
Console.WriteLine("请输入第二个数:");
int number2 = int.Parse(Console.ReadLine());
Calculator cal = MCop(op, number1, number2);
int? iResult = cal.Jisuan(); //这里调用的是子类的计算方法
if (iResult!=null)
{
Console.WriteLine("计算结果是:{0}",iResult.ToString());
}
Console.ReadKey();
}
/// <summary>
/// 简单工厂设计模式(返回值是一个子类,“产品类”;Calculator是父类,“工厂类”,父类变量指向子类对象)
/// </summary>
/// <param name="op"></param>
/// <param name="number1"></param>
/// <param name="number2"></param>
/// <returns></returns>
static Calculator MCop(string op, int number1, int number2)
{
Calculator cal1 = null;
switch (op)
{
case "+": cal1 = new AddFa(number1, number2); break;
case "-": cal1 = new JianFa(number1, number2); break;
}
return cal1;
}
注意,当下面的方法MCop执行完毕后,返回的是产品类,再在主函数中调Jisuan(),就得到想要的结果(“产品”),这就是“简单工厂设计模式”。
============================================================================================
Static关键字: 静态成员(静态字段、静态方法)
1.类中静态成员不能通过类的实例对象名来访问,只能通过类名来访问。
2.在静态函数中不能使用this,因为this代表类的对象;
3.静态成员在整个程序中是共享的,一个地方改变了,其他用到它的地方都会发生改变;而且静态成员占用的内存资源直到程序退出才释放;而实例成员超出其作用域就会释放掉,一个实例成员发生变化,不影响其他实例。
4.静态类中只能包含静态成员,而普通类(不含Static),既可以包含静态成员,也可以包含实例成员。
5.静态类不能被继承,因为他是抽象的(abstract,不能实例化)也是密封的(Sealed,不能被继承).
6.静态类有静态构造函数,其必须加Static关键字;静态构造函数是由系统来调用,而不是程序员来调用的。
7.静态类中的静态成员不能有访问修饰符,也不能有参数(不知道谁传参数进去),默认是Private(私有的).
8.静态类只能继承自Object类,不能实现任何接口(接口中的成员都是实例成员)。
静态类使用不多,那么它的应用场景有:
一般工具类(SQLHelper)、工具方法写成静态的,共有的、不变的属性也写成静态的;其余的属性考虑到内存占用情况,写成普通的(实例的)。
============================================================================================
new关键字的用法:
1.实例化,创建对象;
2.如果在继承中,将子类的同名方法加一个new关键字,则表示隐藏父类继承过来的方法(因为没有通过override重写父类中的方法,故通过父类类型变量调用相同方法时访问的是父类自己的方法,而用子类类型变量调用则访问的是子类中的方法),简单点说,就是父类中的方法和子类中的方法不再有任何关系,跟继承不一样。
C#面向对象的一些东西的更多相关文章
- 巨蟒python全栈开发-第16天 核能来袭-初识面向对象
一.今日内容总览(上帝视角,大象自己进冰箱,控制时机) #转换思想(从面向过程到面向对象) 1.初识面向对象 面向过程: 一切以事物的发展流程为中心. 面向对象: 一切以对象为中心,一切皆为对象,具体 ...
- JS面向对象系列教程 — 对象的基本操作
面向对象概述  面向对象(Object Oriented)简称OO,它是一种编程思维,用于指导我们如何应对各种复杂的开发场景. 这里说的对象(Object),意思就是事物,在面向对象的思维中,它将一 ...
- C#基础-面向对象详解
面向对象详解 一.什么是面向对象 1>面向对象是一种程序设计思想 2>面向过程和面向对象是什么? 例如要把大象放冰箱怎么做? 面向过程:打开冰箱门->把大象扔进去->关上冰箱门 ...
- 1. web前端开发分享-css,js入门篇
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
- WPF基础知识、界面布局及控件Binding(转)
WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...
- C#面向接口编程详解(1)——思想基础
我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到 ...
- MSMQ消息队列 用法
引言 接下来的三篇文章是讨论有关企业分布式开发的文章,这三篇文章筹划了很长时间,文章的技术并不算新,但是文章中使用到的技术都是经过笔者研究实践后总结的,正所谓站在巨人的肩膀上,笔者并不是巨人,但也希望 ...
- WPF基础知识、界面布局及控件Binding
WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...
- java 接口(基础思想一)
我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到 ...
随机推荐
- VS2010+WINDBG+VMWARE9.0和fatal error RC1106: invalid option: -ologo错误
提供属性配置文件一份: http://pan.baidu.com/s/1iS1Ix <?xml version="1.0" encoding="utf-8" ...
- 数据挖掘R与SQL
本文在Creative Commons许可证下发布 对于数据挖掘专业网站 KDnuggets网站的Poll持保留态度,但它的结果毕竟代表了某一类人群的使用偏好,尤其是在语言角度. 我们看排名前5位的语 ...
- c++学习_1
最近重新捧起了<Effective c++>,其中味道又有不同,这里记录之... 这篇文章记录一下public继承的知识点... (1)public继承的意义 该继承方式是代表is-a(是 ...
- 使用AFNetworking 报错提示
使用AFNetworking 框架 解析数据 报错提示数据请求失败Error Domain=NSCocoaErrorDomain Code=3840 "The operation could ...
- NSThread常见方法
// CACurrentMediaTime:获取绝对时间:从新世纪到现在的绝对时间,常用来计算耗时操作的时间差(结束时间 - 开始时间) double start = CACurrentMediaTi ...
- 关于css中z-index 的应用
我想很多人在应用中的会碰到这个问题,设置 z-index无效:无论设置为多高的数字都没有效果: 原因是在设置z-index之前必须满足一下两个条件: 1,给设置z-index的元素设置相应的定位值,p ...
- Enum枚举类|注解Annotation
Enum枚举类 ①枚举类和普通类的差别: 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类 枚举类的构造器仅仅能使用 private 訪问控制符 枚举类的全部实例必须在枚举类中 ...
- 在配置XML时报的The reference to entity "dataSource" must end with the ';' delimiter错误
<?xml version="1.0" encoding="UTF-8"?> <ECharts> <element>http ...
- centos 7 修改主机名称
hostnamectl --static set-hostname <host-name> 参考资料 http://www.centoscn.com/CentOS/config/2014/ ...
- ARM GCC CodeSourcery 下载地址
Sourcery G++ Lite 2011.03-42: https://sourcery.mentor.com/GNUToolchain/package8737/public/arm-none-e ...