Day 9. 新手也能懂的物件导向

新手在学写程序时一定常常看到物件、类别、介面、抽象、继承...奇怪的外星语,可能知道跟物件导向有关但又常常搞不清楚,毕竟程序就是一行一行执行下来,写起来很直觉,也很好懂,但多了这些东西程序感觉就变得很复杂,想搞懂却看文章看到头晕脑胀。没关系!这篇花一点点的时间说明,希望能对新手的学习有帮助。


类别(Class) VS 物件(Object)

首先,我们写程序大部分都是写在Class里面,也就是类别,那类别跟物件有什麽关系?
物件(Object)就是类别(Class)的实体,类别(Class)就是物件(Object)的定义
听不懂对吧?翻成白话文你或许就可以懂了
当你写完的类别没有被执行起来时,他只是一个文字档,但当你的程序Build完要Run起来时,电脑会分配一些RAM的空间来执行你的程序,而当程序执行到你写的类别时,他会去分配一些RAM的空间来给这个类别,这就是实体化,所以没实体化以前,类别只是一些定义了物件实体化後要有哪些特徵的文字而已。以骇客任务(The Matrix)这电影来说,当你写了一个Gun类别,再把母体的世界当成一个RAM里面的空间,你就可以透过实体化这类别而得到一把枪(或是很多把枪),因此反抗军再送救援物资给Neo时,其实只是把救援物资的类别丢到母体的执行绪里面实体化而已。

物件导向三大特性(封装,继承,多型)

这题面试常常考,以前不懂时都是硬背答案,但我觉得现在懂了或许该用我自己的理解分享给新手,让新手在面试时不要再用硬背答案的方式了

  1. 封装:
    物件导向有着对物体内部用的定义,以及可以给外部的定义,例如大脑可以执行很多指令,例如接收五感(视觉、听觉、嗅觉、味觉和触-压觉),操作手脚肌肉,但你无法凭自己的意志决定自己的心跳速率要有多快,因为这个方法只开放给内部使用(脑干),但我们保留了一个心跳速率这个属性给外部知道,让医生可以透过仪器测量出心跳速率,但他只能接收,不能改变他的值,因此如果写成C#程序,这个属性会可能是长成这样
public double HeartBeat { get; private set; }

上方的心跳速率这个属性是公开(public)的,大家都能取值(get方法),但要设定这值等於多少并不开放给外部(private set方法),其中要决定心跳速率要有多快可能是一个private的方法来决定,因此可能还会需要一断类似这样的Code

        private void SetHeartBeatValue()
        {
            //TODO:运算心跳的逻辑
            HeartBeat = 60;
        }
  1. 继承:
    继承就像是你让某些你要的一些类别拥有一些同样方法或特性,但你又不想一直复制贴上,你就可以透过抽出这些共用的方法特性写成一个父类别,然後分别让这些需要拥有这些方法特性的类别继承他,以车子为例:
    public class Car
    {
        public int  Speed    { get; set; }
        public virtual void AddSpeed()
        {
            Speed += 1;
        }
        public virtual void TurnLeft()
        {
             //TODO:左转的逻辑
        }
        public virtual void TurnRight()
        {
            //TODO:右转的逻辑
        }
    }
    public class Tesla : Car
    {
        
    }

其中子类别特斯拉继承了Car类别,因此他不用再写加速、左转、右转的方法,别的地方实体化Tesla时,就会有这些方法能用了,例如

            var tesla = new Tesla();
            tesla.AddSpeed();
            tesla.TurnLeft();
            tesla.TurnRight();

而子类别继承了父类别的特性要修改的话也能做到,例如我希望另一个类别法拉利的加速要快一点,我可以这样

    public class Ferrari : Car
    {
        public override void AddSpeed()
        {
            base.Speed += 3;
        }
    }

关於C#的修饰词,例如上面出现的public、private、virtual、override等等,本篇就不介绍了,请新手去看看其他铁人赛有介绍C#的文章吧。
下一篇继续介绍没讲完的多型~


<<:  [Day9] Reactstrap = Bootstrap in React,你看离 React 越来越近了吧

>>:  D10 第五周 (回忆篇)

Day 7:持续拆解主类别

上一篇漏掉了一个主类别的函数: void anotherInstanceStarted (const...

Day5|【Git】动手建立、初始储存库(Repository)!

这里我们先看一张图,大概了解一下 Git 在发布专案时的流程。 先有个概念,之後会逐一详细解释。 开...

Day 18: To DI ? Or not DI? 依赖注入的存在意义

Keyword: Dependency Injection 到Day20 使用Koin管理依赖注入显...

[想试试看JavaScript ] for回圈

回圈 for 回圈 for 回圈,很适合用来处理数值会依照次数,有「递增」或「递减」的变化 范例如下...

Day#26 传送对话(1)

前言 前一天结束在点选某个搜寻到的使用者,今天接着做跟该使用者展开对话吧! New Conversa...