C# 物件導向程式設計(Object-oriented programming,OOP) (二) 封裝

封裝:(Encapsulation):指的是將一組相關的屬性、方法和其他成員,視為單一單位或物件。

物件都會擁有物件內部的私有部分(屬性、方法...)而這些部分必須是外界無法直接存取,這樣才能保有物件的完整性。
如果"破壞封裝"的話,會有可能無法恢復原來的功能,因此物件必須將私有的部分封裝在物件的內部,而使用者只能藉由物件所提供的方法、屬性來操控物件,以保持物件的完整性,這就是封裝的特性。

封裝當中也有另一個概念就是所謂的"抽象化",也就是對於一個事物來說,我們只需要知道他怎麼操作就好,但是它的內部構造或實作方法是怎麼樣的我們不需要去理解,所以我們在實施封裝的特性時,就要讓別人不知道類別的內部成員是如何實作,只能透過該物件提供的公開類別成員來進行操作。

 

本文以C#實作執行介紹。

 

例如一台車子,我們只要能開就好,使用者不須要知道為什麼踩了油門之後,車子就會發動,只要知道怎麼開車就好。

class car
    {
        private int _speed = 0;

        string _direction;

        public int getSpeed()
        {
            return _speed;
        }

        public void setSpeed(int vSpeed)
        {
            if (vSpeed < 0)
            {
                vSpeed = 0;
            }
            if(vSpeed > 300)
            {
                vSpeed = 200;
            }
            _speed = vSpeed;
        }

        public string getDirection()
        {
            return _direction;
        }

        public void setDirection(string s)
        {
            if(s =="left" || s=="right" || s =="back")
            {
                _direction = s;
            }

            else
            {
                _direction = "error direction";
            }
        }
        
        public void Accelerate()
        {
            _speed++;
        }
    }

以下是完整程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace C_sharp封裝
{
    class car
    {
        private int _speed = 0;

        string _direction;

        public int getSpeed()
        {
            return _speed;
        }

        public void setSpeed(int vSpeed)
        {
            if (vSpeed < 0)
            {
                vSpeed = 0;
            }
            if(vSpeed > 300)
            {
                vSpeed = 200;
            }
            _speed = vSpeed;
        }

        public string getDirection()
        {
            return _direction;
        }

        public void setDirection(string s)
        {
            if(s =="left" || s=="right" || s =="back")
            {
                _direction = s;
            }

            else
            {
                _direction = "error direction";
            }
        }
        
        public void Accelerate()
        {
            _speed++;
        }
    }



    class Program
    {
        static void Main(string[] args)
        {
            car Maserati = new car();

            Console.WriteLine("After  Maserati.setDirection(\"left\"); ");

            Maserati.setDirection("left");

            Console.WriteLine("Maserati turn: "+ Maserati.getDirection());

            Console.WriteLine("After  Maserati.setDirection(\"forward\"); ");

            Maserati.setDirection("forward");

            Console.WriteLine("Maserati turn: " + Maserati.getDirection());

            Console.WriteLine();

            Maserati.setSpeed(299);

            Console.WriteLine("Maserti's speed:" + Maserati.getSpeed());

            Console.WriteLine("Accelerate.....");

            Maserati.Accelerate();

            Console.WriteLine("Maserti's speed:" + Maserati.getSpeed());

            Console.WriteLine("Accelerate.....");

            Console.WriteLine("Maserti's speed:" + Maserati.getSpeed());

            Console.WriteLine();

            Console.ReadKey();
        }
    }
}

使用者只要知道車子怎麼樣左轉或右轉或倒退或是如何踩油門開車就好。而為什麼轉動方向盤車子就會轉方向,或是為什麼踩了油門車子就會動,或是車子速度限制是為什麼限制在300km/h的,使用者是不需要知道的。

執行結果如下:

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace