快过年了,发一篇自己的复习总结。以下内容均是个人理解,如文章有幸被浏览,如有错误的地方欢迎大家提出,相互学习相互进步!

面向对象三大基本特征:封装,继承,多态

一、类

(对象声明的三种方式:以普通基类身份声明的变量并用基类对象赋值,以普通基类身份声明的变量并用子类对象赋值,以子类身份声明的变量并用子类对象赋值,抽象类声明的变量必须由子类进行赋值(抽象类不能new))

1、类的分类:普通基类,抽象基类(abstract):抽象类天生(public)是给人继承的,不能new(声明对象),纯抽象类(接口)

2、基本概念

  • 类的统一成员分类:私有成员(仅在类的内部使用),共有成员(全宇宙可见),受保护成员(在类的内部和子类中使用)
  • 子类继承基类:子类可以继承基类的共有成员和受保护成员,不能继承私有成员
  • 子类访问基类成员时一般要使用base关键字
  • 类成员的扫描顺序:以谁身份声明的变量就在谁身上开始扫描,先近后远
  • 类的访问原则:类的外部只能访问类的共有成员,子类可访问基类的共有成员和受保护成员(继承)
  • 构造函数:函数名和类名相同(函数没有返回类型,使用public修饰)

4、类的成员分类:

  • 普通基类虚成员:类成员使用virtual 关键字修饰的为类的虚成员,可以被子类重写,被子类重新的条件条件是子类的同名方法必须由override关键字修饰(使用情景:以基类身份声明的变量,并以子类对象赋值,当调用方法时现在基类身上开始扫描,找到需要使用的方法并且方法是用virtual关键字修饰的虚成员,转而向子类进行扫描,如果在子类身上找到对应的方法,并且该方法用override关键字进行修饰,那么就调用子类方法,否则调用基类自己的方法)
  • 抽象类成员:实例成员(在子类身上得到体现),抽象成员:抽象类中的抽象成员没有具体的实现,也就是没有方法体,就是没有花括号。所以继承抽象基类的子类必须实现基类的抽象成员,才能使抽基类的抽象成员得到体现

5、抽象类特别注意事项:继承抽象类的子类必须实现抽象类的抽象成员,就是必须使用override(重写)关键子修饰基类同名抽象成员

6、对继承概念的认识:子类继承了基类,在程序入口调用方法时,子类的构造函数继承了基类的构造函数。以子类身份声明的变量并以子类对象赋值,当调用子类中成员时,按照类的访问规则,此时我们可以发现,基类通过子类继承的构造函数,获得了具体的成员

二、接口

interface声明接口,接口是纯抽象类,不能new。接口定义一些成员,不是用public关键字修饰,默认就是共有的////接口成员是纯虚成员

主程序中调用接口时注意:

  • 以接口身份声明的变量必须以实现接口的类的对象进行赋值
  • 以那个接口身份声明的变量只能点出这个接口定义的成员(当一个类型继承了多个接口时,使用这个类型调用接口时)
  • 接口成员是方法的声明(王老师名言)

接口的实现:实现接口的类必须实现接口成员

接口的显示实现和隐式实现:当类实现单接口时一般使用隐式实现,实现多接口特别是多接口中定义了同名成员时要使用显示实现(加接口名前缀)

£子类访问基类:在子类的内部可以访问基类共有成员和受保护成员,在子类的外部。子类对象只能访问基类的共有成员(类的外部只能访问类的共有成员)

三、继承

子类继承基类,基类的构造函数:声明子类对象时,子类的构造函数要先给基类构造函数传参,基类构造函数先于子类构造函数执行

四、函数的重载:一个类中,函数名相同签名不同的方法称为函数的重载,签名指:返回类型,参数类型,参数数量,参数的顺序

五、区别普通基类虚成员和抽象基类抽象成员

  • 普通基类虚成员使用virtual关键字修饰,其子类可以不必重写(override)其虚成员
  • 抽象基类抽象成员使用abstract关键字修饰,其抽象成员没有具体的实现必须由子类来实现(override)

六、抽象基类多态的理解:子类继承抽象基类使用基类作为一个大的主题,使用引擎类对基类的访问,实现对每个继承基类子类成员的调用(联想动物代码)

七、接口(纯抽象类)和抽象类的异同:

  • 异:接口是纯抽象类,不能有任何实例成员,抽象类可以存在实例成员,并在子类中可以得到体现。接口使用关键字interface修饰,抽象类使用abstract修饰,接口的成员不使用任何的修饰字,抽象类抽象成员使用abstract进行修饰,子类继承抽象基类必须重写基类中的抽象成员(override)
  • 同:接口的成员(方法),抽象类的抽象成员不能具体的实现,也就是没有方法体,也就是没有花括号,只需要声明

八、接口实现多态(多变性、灵活性):语法级别优化代码

声明:以下代码中出现的中文全是本人自称为新时代“爱因斯坦”的东北老师的作品æ

1、声明接口,实现接口的类

 1 namespace OODemo
2 {
3 //接口是纯抽像类,不能有任何实例成员,接口的成员是方法的声明
4 public interface IWeapon
5 {
6 //接口成员天生就是public所以你不能加public关键字
7 void Fire();
8 }
9 //实现接口的类必须实现接口成员
10 public class Gun : IWeapon
11 {
12 public void Fire()
13 {
14 Console.WriteLine("pa peng pa peng");
15 }
16 }
17
18 public class Sword : IWeapon
19 {
20 public void Fire()
21 {
22 Console.WriteLine("七剑下天山");
23 }
24
25 }
26
27 public class Tank : IWeapon
28 {
29 public void Fire()
30 {
31 Console.WriteLine("压死你");
32 }
33 }
34
35 public class Xiaomugun : IWeapon
36 {
37 public void Fire()
38 {
39 Console.WriteLine("扎死你");
40 }
41 }
42 }

2、使用一个“引擎类”:Engine作为中间层以接口类型的变量为参数

 namespace OODemo
{ class Engine
{
//耦合//解耦//分离关注点
public static void Play(IWeapon w)
{
w.Fire();
}
}
}

3、使用实现了接口的类作为参数,调用各自实现接口成员的功能

 namespace OODemo
{
class Program
{
static void Main(string[] args)
{
Engine.Play(new Gun()); Engine.Play(new Tank());
Engine.Play(new Sword());
Engine.Play(new Xiaomugun());
} public void Fire()
{
Console.WriteLine("七剑下天山");
}
}
}

九、抽象类实现多态:方式和接口实现多态的相似,一下直接书写举例代码(接口和抽象类实现多态的异同没弄明白)

问题:接口和抽象类都可以实现多态,只需要有一个就可以了,要么接口要么抽象类,为什么两个都存在?那么那个更好些?

、声明三个基础类继承抽象类Animal
抽象类:
namespace OODemo
{
abstract class Animal
{
public abstract void Play();
}
} 基础类:
namespace OODemo
{
class Cat : Animal
{
public override void Play()
{
Console.WriteLine("喵喵喵,快给我条鱼");
}
} class Dog : Animal
{
public override void Play()
{
Console.WriteLine("汪汪汪,快给我根肉骨头");
} } class Mouse : Animal
{
public override void Play()
{
Console.WriteLine("zhi zhi zhi");
}
}
} 使用引擎类 namespace OODemo
{
class Engine
{
public void Play(Animal a)
{
a.Play();
}
}
} 调用 namespace OODemo
{
class Program
{
static void Main(string[] args)
{
//有爽,啰嗦,玩就玩吗,你还playdog,playcat的
Engine e = new Engine();
//e.Play(new Animal()); Dog dd = new Dog();
e.Play(dd);
////dd.PlayD(); Cat cc = new Cat();
e.Play(cc);
////cc.PlayC(); Snake sn = new Snake();
e.Play(sn); Mouse m = new Mouse();
e.Play(m);
}
}
}

静态类,静态方法

C#面向对象基本概念总结的更多相关文章

  1. JAVA_SE基础——22.面向对象的概念

    我写博客是为了提升自己和为了进入黑马程序员学习,还有分享些自己的心得给大家,希望能帮助大家学习JAVA. 我是自学的,如果写的有错误或者能更好的修改的请提出. 在这里我先引用下<think in ...

  2. Python中面向对象的概念(科普)

    面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...

  3. python面向对象基本概念(OOP)

    面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...

  4. OO 面向对象的概念

    面向对象的概念 一.什么是面向对象? 传统的:世间万物都是对象.例如:桌子,凳子,电脑等: 个人理解: 1.软件开发方法: 2.面向对象是一种解决问题和分析问题的(编程)一种思想: 3.他是通过面向过 ...

  5. Python面向对象之面向对象基本概念

    面向过程和面向对象概念 过程和函数:过程类似于函数,只能执行,但是没有返回结果:函数不仅能执行,还能返回结果. 面向过程和面向对象 基本概念 面向过程-怎么做 把完成某一个需求的所有步骤从头到尾逐步实 ...

  6. day6_面向对象的概念

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/11 16:20 # @Author : 大坏男孩 # @File : d ...

  7. C# 面向对象之概念理解

    什么是对象? <韦氏大词典>中对对象定义: (1)某种可为人所感知的物质. (2)思维.感受或动作所作用的物质或精神体. ----说白了万物皆对象 熟悉的对象描述: 对象就是客观世界中的物 ...

  8. C#面向对象 基础概念25个

    1.静态成员和非静态成员的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal 修饰符起什么作用?6.s ...

  9. JavaScript之面向对象的概念,对象属性和对象属性的特性简介

    一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...

随机推荐

  1. iframe 父页面调用子页面的vue方法

                    父页面代码:            html: <div id="app"> //省略业务代码x行..... <iframe sr ...

  2. 20190329-盒尺寸、boder-

    目录 1.盒尺寸四家庭 width:宽度 height:高度 margin:外边距 padding:内边距 盒模型: 2.border边框 border简写:border-position(top | ...

  3. jsp内置对象-config对象

    1.概念:config对象中存储了一些Servlet初始化的数据结构,当Servlet初始化时,JSP容器通过config对象将这些信息传递给这个Servlet.一般在web.xml文件中配置Serv ...

  4. Odoo:全球第一免费开源ERP库龄表的简单实现方法(无需二开)

    问题背景 希望查看库龄超过30天的货物,该如何实现?此种简单数据查询需要二开吗? 解决方案 方法一:Stock Quant列表视图增加过滤器 <filter string="库龄超30 ...

  5. Dotspatial 空间要素选择

    //通过遍历选择要素,获取选择要素相交的要素 private void toolStripButton43_Click(object sender, EventArgs e) { //查看与选中要素重 ...

  6. 一种动态写入apk数据的方法(用于用户关系绑定、添加渠道号等)

    背景: 正在开发的APP需要记录业务员与客户的绑定关系.具体应用场景如下: 由流程图可知,并没有用户填写业务人员信息这一步,因此在用户下载的APP中就已经携带了业务人员的信息. 由于业务人员众多,不可 ...

  7. 常见的异步方式async 和 await

    之前研究过c#的async和await关键字,幕后干了什么,但是不知道为什么找不到相关资料了.现在重新研究一遍,顺便记录下来,方便以后查阅. 基础知识 async 关键字标注一个方法,该方法返回值是一 ...

  8. 【SpringBoot笔记】SpringBoot整合Druid数据连接池

    废话少说,按SpringBoot的老套路来. [step1]:添加依赖 <!-- 数据库连接池 --> <dependency> <groupId>com.alib ...

  9. Git源代码管理

    一. 分支管理 使用 git 进行源代码管理,一般将某个项目的所有分支分为以下几条主线 1. Master 顾名思义,既然名字叫 Master ,那么该分支就是主分支的意思. master 分支永远是 ...

  10. python 操作Excel文件

    1   安装xlrd.xlwt.xlutils cmd下输入: pip install xlrd        #读取excel pip install xlwt        #写入excel pi ...