C#面向对象基本概念总结
快过年了,发一篇自己的复习总结。以下内容均是个人理解,如文章有幸被浏览,如有错误的地方欢迎大家提出,相互学习相互进步!
面向对象三大基本特征:封装,继承,多态
一、类
(对象声明的三种方式:以普通基类身份声明的变量并用基类对象赋值,以普通基类身份声明的变量并用子类对象赋值,以子类身份声明的变量并用子类对象赋值,抽象类声明的变量必须由子类进行赋值(抽象类不能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#面向对象基本概念总结的更多相关文章
- JAVA_SE基础——22.面向对象的概念
我写博客是为了提升自己和为了进入黑马程序员学习,还有分享些自己的心得给大家,希望能帮助大家学习JAVA. 我是自学的,如果写的有错误或者能更好的修改的请提出. 在这里我先引用下<think in ...
- Python中面向对象的概念(科普)
面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...
- python面向对象基本概念(OOP)
面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...
- OO 面向对象的概念
面向对象的概念 一.什么是面向对象? 传统的:世间万物都是对象.例如:桌子,凳子,电脑等: 个人理解: 1.软件开发方法: 2.面向对象是一种解决问题和分析问题的(编程)一种思想: 3.他是通过面向过 ...
- Python面向对象之面向对象基本概念
面向过程和面向对象概念 过程和函数:过程类似于函数,只能执行,但是没有返回结果:函数不仅能执行,还能返回结果. 面向过程和面向对象 基本概念 面向过程-怎么做 把完成某一个需求的所有步骤从头到尾逐步实 ...
- day6_面向对象的概念
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/11 16:20 # @Author : 大坏男孩 # @File : d ...
- C# 面向对象之概念理解
什么是对象? <韦氏大词典>中对对象定义: (1)某种可为人所感知的物质. (2)思维.感受或动作所作用的物质或精神体. ----说白了万物皆对象 熟悉的对象描述: 对象就是客观世界中的物 ...
- C#面向对象 基础概念25个
1.静态成员和非静态成员的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal 修饰符起什么作用?6.s ...
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...
随机推荐
- Django 提交 form 表单(使用sqlite3保存数据)
优化 提交 form 表单,https://www.cnblogs.com/klvchen/p/10608143.html 创建数据库的字段,在 models.py 中添加 from django.d ...
- css 修改默认滚动条样式
来自:https://www.cnblogs.com/juqian/p/6273808.html 侵删 <div class="inner"> <div clas ...
- ubuntu server 16.04 开启root密码登录
0x00 ubuntu server 16.04 开启root密码登录 由于众多VPS默认使用证书验证登录,虽然安全但使用十分不便,所以特提供开启root用户并使用密码登录方法. 0x01 为root ...
- 修改rpm中的文件重新打包
1.安装rpmrebuild 和安装rpmbuild rpmrebuild下载链接:https://sourceforge.net/projects/rpmrebuild/files/rpmrebui ...
- php redis 处理websocket聊天记录
<?php ini_set('display_errors', 'on'); class chatClass { private $redis; //这个变量模拟用户当前状态,是否登录,是否可查 ...
- 04 前端篇(JQuery)
jquery: http://www.cnblogs.com/yuanchenqi/articles/5663118.html 优点:简洁.兼容 jquery 对象: jQuery 或 $ 基本 ...
- typeScript面对对象篇二
接口 接触过面向对象的后端语言的应该对接口很熟悉,只接触过前端的对接口会有点陌生,在维基百科中对OOP中接口的定义是这样的: 在面向对象的语言中,术语interface经常被用来定义一个不包含数据和逻 ...
- python全局解释器GIL
1.什么是进程: 进程是竞争计算机资源的基本单位.对于单核CPU来讲,同一时间只能有一个进程在运行,所以当我们开启多个应用时,操作系统需要根据进程调度算法去在不同的应用程序之间切换,而不同的进程之间切 ...
- swift学习 引入三方遇到的问题
问题来源: 1.swift项目pods MJRefresh 为了在swift正常使用 建了一个桥接文件 2.在项目中又使用了 SDWebImage 用于加载网络图片 根据说明加了Podfile一个 ...
- webpack code splitting
一.代码分割优化 const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin' ...