【C# 复习总结】类、继承和接口
1 类
定义新的数据类型以及这些新的数据类型进行相互操作的方法
定义方式:
class Cat
{
}
class Cat:object
{
}
C#中所有的类都是默认由object类派生来的,显示指定或者省略效果是一样的,所以上面的两个例子是完全相同的。 C#中类包括:抽象类、密封类、非抽象类
abstract:表示修饰的类不完整,也就是抽象类,只能用做基类。 在使用是不能直接实例化,
不能使用new运算符。
sealed:表示修饰的类不可派生,也就是密封类。 base:访问最近的基类,也就是当前类继承的类 class Cat:Animal
{
public void Cat()
{
base.Eat();
}
} 以上例子中base代表Animal。
注意:base只能在类的内部使用。
2 继承
2.1 继承定义
继承: 把两个或多个类的相同属性提取出来,将这些属性合在一起建立父类!
2.2 使用
class A
{
public void Sum(int i,int j)
{
int sum = i + j;
Console.WriteLine("I am A ,my sum ={0}",sum);
}
}
class B : A
{
public void Minus(int i,int j)
{
int minus = i - j;
Console.WriteLine("I am B ,my minus ={0}", minus); this.Sum(, );
} }
class InheritanceTest1
{
static void Main(string[] args)
{
B b = new B();
b.Minus(, );
Console.Read();
}
} 结果:I am B ,my minus=- I am A ,my sum =
3 接口
注意:介绍接口形象生动的一篇文章,极力推荐阅读:https://www.cnblogs.com/hamburger/p/4681681.html
3.1 定义
一个接口定义一个协定。接口可以看成是特殊的抽象类,但是又有所区别。
一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现,而抽象类中可以提供定义成员的实现。
接口只指定实现该接口的类或结构必须提供的成员。 接口本质上是一种类
不过他与类的区分还是很明显的——不能实例化
他的精髓在于提供一些类共同的地方,而且能“多继承” 我们知道所谓对象其实是数据和方法的封装。接口的作用更多的是工程上的,一般上我们用他来封装通用的行为,来达到程序的多态。 不必用object的观点来统一接口,在我的感觉中,继承简化对象结构,增加代码重用,接口抽象行为。
3.2 关于接口的几个小问题
1. 接口本质上是类吗 这个,要看你认为“类的本质是什么”了,过多纠缠于这个说法,很容易陷入文字之争,意义不大。 2. 接口和类有什么区别和联系,主要是联系 区别:
类的定义需要“实现”,接口的定义只需要“声明”;
类能实例化出一个对象,接口不能;
类只能单根继承,接口可以多根继承;
继承一个类,相当于借用了它已实现的功能,实现一个接口,相当于对外做了一个承诺;
…… 联系:类可以“实现”接口 3. 接口是否具备类的特征 这要看你认为哪些是“类的特征”,hehe,比如,“编译后会生成一个 .class 文件”算不算特征…… 4. 接口是否是Object 不是。但可以用一个接口型的变量来引用一个对象,而且,被引用的对象,说到底,一定是一个 Object。 1、纯虚类与接口不同的是,纯虚类可以包含一些实现
2、用纯虚类包含一些基本的功能或方法
3、用接口来定义客户端与组件之间的通讯方法
4、虚基类的实现的变化可能会影响派生类
5、使用接口要比使用继承具有更强的适用性
3.3 接口的一些特征
不可以包含任何实现;没有构造方法;任何成员都隐式声明为public; 接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!
而类是负责功能的具体实现! 在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
但接口是一个行为的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口
PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使用好处,最直接的就是
设计原则中OCP(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使用,对与扩展是开放的,我们可以另写
一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个 “不能够”是指在规范原则上不应该这么做!
3.4 接口的使用
接口的使用–多态的实现:
public interface IPolimorphism()
{
void Say();
}
建立一个Class1.cs文件,定义两个类,扩展IPolimorfism:
using System;
using System.Windows.Forms;
namespace NorthWind
{
public class Red:IPolimorphism //实现接口的方法
{
public void Say() //不需要指定override关键字
{
MessageBox.Show("Red!");
}
} public class Yello:IPolimorphism
{
public void Say() //不需要指定override关键字
{
MessageBox.Show("Yello!");
}
} }
另一个MainFrm.cs文件,应用程序入口处:
using System;
using System.Windows.Forms;
namespace NorthWind
{
public class MainFrm : System.Windows.Forms
{
[STAThread]
static void Main()
{
IPolimorphism red = new Red();
red.Say();
IPolimorphism yello = new Yello();
yello.Say();
} }
}
举个例子,有一个老汉,做了一个面饼,给了他的几个儿子,老大用这个饼,加上点馅,包一下,做成了包子,老二用这个面饼,在外面刷上油,撒上料,烤一烤,做成了土家烧饼,老三呢,胡乱做,在饼上抹上乱七八糟的东西,烤一烤,做成了披萨饼.基类和派生类的关系就是这样,基类提供了基本的实现,派生类就在上面添料,最终就成了每个人心中想要的饼.
那接口的故事则不一样,老汉没有给众人面,老汉这回给儿子们画了一个饼的设计图,规定了这个饼的厚度,直径等等,然后把这个规格表发给儿子们了,儿子们拿着画的饼,各自按自己的想法去做了.
两个故事的区别告诉我们,接口是一种规格,是一个统一的标准,在实际应用中,接口有两方法的作用.
1,通过接口更容易表现设计,更容易沟通,而且接口是没有实现代码的,因此,定好接口,再写实现代码,就算设计上有变动,也可以通过接口轻易实现修改.而如果不用接口的话,你将直接去写类,好不容易实现了一个类的代码,如果设计上有少许的变动,就要去改代码.
2.接口是写类的实现者看的,这好比建筑图纸是画给施工工人看的.
【C# 复习总结】类、继承和接口的更多相关文章
- PHP类继承、接口继承关系概述
PHP类继承: PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &quo ...
- C#虚基类继承与接口的区别
类:定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指定或 ...
- C#类继承和接口继承时一些模棱两可的问题[转]
原文地址:http://www.cnblogs.com/harleyhu/archive/2012/11/29/2794809.html 1.在father定义的方法若含有virtual关键字,chi ...
- 简单老式Java对象 横切关注点 最小侵入性编程 声明式编程 避免强迫类继承和接口实现
Spring In Action data injection aspect-oriented programming Plain Old Java Object 依赖注入能让相互协作的软件组件保持松 ...
- 简单的java实验,涉及到 类继承以及接口问题,方法体的重写(区别于重载)
package test ; abstract class Animal { abstract void cry(); abstract String getAnimalName(); } class ...
- 编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程
建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttr ...
- EF中多表公共字段,以及设置EntityBase使所有实体类继承自定义类
使用EF框架访问数据库时,如果某些表具有公共字段,例如在审核流程中,对于各类申请单资料的创建人.创建时间.修改人.修改时间,这些可能多表都需要的字段,如果在每个实体中进行赋值操作显然是类似和重复的,下 ...
- 【转】编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程
建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttr ...
- swift类、继承、接口
import Foundation class Hello{ var _name:String?="swift global" init(name:String){ //定义类中有 ...
随机推荐
- Python __init__.py文件的作用
我们经常在python的模块目录中会看到 "__init__.py" 这个文件,那么它到底有什么作用呢? 1. 模块包(module package)标识 如果你是使用pytho ...
- 初学ubuntu之文件权限权限
今天接着做笔记,坚持学习下去. 文件权限修改命令,初学者看见这个命令之后总有些摸不着头脑,这命令里面用到了一些数字,我 自己也是,这次写一篇自己的认识.希望能够帮助到需要学习的人. 首先你可以通过 l ...
- 探索SQL Server元数据(二)
背景 上一篇中,我介绍了SQL Server 允许访问数据库的元数据,为什么有元数据,如何使用元数据.这一篇中我会介绍如何进一步找到各种有价值的信息.以触发器为例,因为它们往往一起很多问题. 那么如何 ...
- 使用 boost.asio 简单实现 异步Socket 通信
客户端: class IPCClient { public: IPCClient(); ~IPCClient(); bool run(); private: bool connect(); bool ...
- June 11. 2018 Week 24th, Monday
Love is the beauty of the soul. 爱是灵魂之美. From Saint Augustine. The complete version of this quote goe ...
- A - Packets 贪心
A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, ...
- bs4 解析 以及用法
bs4解析 bs4: 环境安装: lxml bs4 bs4编码流程: 1.实例化一个bs4对象,且将页面源码数据加载到该对象中 2.bs相关的方法或者属性实现标签定位 3.取文本或者取属性 bs的属性 ...
- java锁的种类以及辨析(一):自旋锁
作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...
- LDAP安装配置(windows)
目录 概述 测试环境 安装过程 配置启动 客户端介绍 多级DC的ldif文件的配置 [一].概述 什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台 ...
- SQL 简介
SQL 是用于访问和处理数据库的标准的计算机语言. 什么是 SQL? SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言 编者注:ANSI,美国国家标 ...