C# 入门笔记02

物件导向


这单元主要是让大家了解物件导向的基本实作
物件导向有三大特性:

  • 封装
  • 继承
  • 多型

封装

类别的内部成员可以封装起来,让别人不知道其如何实作,只能透过它提供的公开类别成员来进行操作,封装的观念和抽象化类似,但多了安全的概念,使用者只能使用公开的属性或方法,不可以直接存取类别私有的属性或方法。
要存取类别私有的属性或方法,需透过类别公开的方法,而设计师可在这些公开的方法中先做安全性检查。
例如:一台电视,只要能看就好,使用者不需知道其构造和原理,透过电视的面板或摇控器来进行操作如果电视没有封装,使用者看电视时会许就得自己把电线找出来接在一起 ⇒ 操作复杂且不安全

继承

继承让程序码可以重复使用。就以车子、汽车与卡车的例子来说吧。我们把大部分重复的程序码写在车子的类别里,以後的十种汽车跟八种卡车都可以直接享用车子中已经定义好的程序码与功能。我们因此缩短了浪费在重复性工作上的时间。

多型

多型跟继承有很大的关系,以老鹰与企鹅来比喻:
老鹰与企鹅都是继承鸟纲但是两者最快速移动方式
老鹰是飞翔,企鹅是游泳,他们都继承鸟类所有继承特徵与行为,但移动的行为老鹰是在天上飞最快,企鹅在海里游最快,同样都是移动,但行为不同,结果一样这就是多型

一、物件封装范例

这篇主要在介绍物件封装

有一个Rectangle物件。 它有长度(length)和宽度(width)的属性。 根据设计,它可能需要接受这些属性的值,计算面积和显示细节的方法。

void作为方法的传回类型或区域函数,来指定方法不会传回值。
double作为使用计算浮点数值型别类型

实际操作基本程序码:

    class Rectangle
    {
        // member variables
        double length;
        double width;
        public void Acceptdetails()
        {
            length = 10.0;
            width = 20.1;
        }

        public double GetArea()
        {
            return length * width;
        }

        public void Display()
        {
            Console.WriteLine("Length: {0}, Width:{0}, Area:{0}", length, width, GetArea());
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }
    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.Acceptdetails();
            r.Display();
            Console.ReadLine();
        }
    }

输出的值为:

Length: 10,
Width: 20.1,
Area: 201

换个题型操作实例:

在下面的范例中,函式GetArea()没有使用任何存取说明符宣告。如果没有使用任何一个存取说明符的类成员, 预设使用的是私有的。

using System;
namespace RectangleApplication
{
    class Rectangle
    {
        //member variables
        internal double length;
        internal double width;

        double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }//end class Rectangle

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.length = 12.5;
            r.width = 8.25;
            r.Display();
            Console.ReadLine();
        }
    }
}

输出值为:

Length: 12.5
Width: 8.25
Area: 103.125

接下来我们来动动脑,做几个简单的小游戏吧
范例一

建立物件的方式为:new Class名称()

  1. 创立一个空白专案,并将class命名为Student
  2. 宣告变数
  3. 建立Method
public class Student
    {
        //宣告变数
        public int StudentID;
        public string Name;
        public int Grade;
        
        //Method
        public string Say()
        {
            return $"我叫{Name},我是{Grade}年级的学生";
        }
        public string Talk(int sgrade, string sname)
        {
            return $"{Grade}年级的{Name}对{sgrade}年级的{sname}说Hello";
        }
    }
  1. 创立一个form表单
  2. 引入Method的专案
    ※(假设Method为namespace Demo,那表单引入方法即为:using Demo;)
  3. 呼叫函式
 private void button1_Click(object sender, EventArgs e)
        {
            Student s = new Student();
            s.Name = "老王";
            s.Grade = 3;

            MessageBox.Show(s.Talk(2, "小明"));
            //3年级的老王对2年级的小明说Hello
            MessageBox.Show(s.Say());
            //我叫老王,我是3年级的学生
        }

范例二

  1. 制作一个max的function,分别带入2个参数
//method
public int max(int a, int b)
        {
            int result;

            if (a < b)
            {
                result = b;
            } else
            {
                result = a; 
            }
            return result;
        }
  1. 宣告int a, b, c三个变数
  2. 分别赋予变数值
private void button1_Click(object sender, EventArgs e)
        {
            //建立一个新物件m
            Person m = new Person();
            int a = 10;
            int b = 20;
            int c = m.max(a, b);
            
            //Number前面加"",是强制将数字转为字串
            MessageBox.Show("" + c); //20
        }

范例三

再来创建一个小游戏,让大家能够一起练习

  1. 创建Name、Money的变数
  2. 创建一个borrow和repay的function做逻辑判断,判断教学写在程序码内
    class Person
    {
        //创建变数
        public String Name;
        public int Money;

        public Person(String name, int money)
        {
            this.Name = name;
            this.Money = money;
        }
        
        public void borrow(Person lender, int money)
        {
            //如果朋友的钱 >= 我借的数量
            if (lender.Money >= money)
            {
                lender.Money -= money; //跟朋友借钱,则朋友的户头会减少
                this.Money += money; //我的户头增加
            }
        }
        public void repay(Person lender, int money)
        {
            //如果我的钱 >= 我借的钱
            if (this.Money >= money)
            {
                this.Money -= money; //还给朋友钱时,自己的户头会减少
                lender.Money += money; //朋友的户头钱变多
            }
        }
    }
  1. 创建2个物件,分别为my、friend
  2. 设定Enabled按下提交後,是否能够做修改
    public partial class Form1 : Form
    {
        Person my, friend;
        public Form1()
        {
            InitializeComponent();
        }
        private void submit_Click(object sender, EventArgs e)
        {
            my = new Person(myInput.Text, 0);
            friend = new Person(friendInput.Text, 20000);

            myInput.Enabled = false;
            friendInput.Enabled = false;
            submit.Enabled = false;
            borrowButton.Enabled = true;
            repayButton.Enabled = true;

            borrowButton.Text = $"跟{friend.Name}借了$1000";
            repayButton.Text = $"偿还{friend.Name}$1000";

            myNameLabel.Text = $"{my.Name}";
            friendNameLabel.Text = $"{friend.Name}";
        }
        private void borrowButton_Click(object sender, EventArgs e)
        {
            my.borrow(friend, 1000);
            updateMoney();
        }
        private void repayButton_Click(object sender, EventArgs e)
        {
            my.repay(friend, 1000);
            updateMoney();
        }
        private void updateMoney()
        {
            myMoneyLabel.Text = "" + my.Money;
            friendMoneyLabel.Text = "" + friend.Money;
        }
    }

<<:  证书签名请求(CSR)

>>:  C# 入门笔记03(封装)

用 Python 畅玩 Line bot - 19:加入与移除好友

当加入一个 line bot 的时候,通常 bot 会传送一个欢迎讯息给使用者,而此设定除了可以透过...

Day-26 事件机制(2)

承前文,在事件的注册/绑定与监听中,入门者最常使用「监听CLICK事件」等侵入/非侵入式JavaSc...

Flutter在Android模拟器无法安装release apk原因

Android模拟器在安装由Flutter APP产生的app-release.apk遇到 the ...

Golang 转生到web世界 - gin路由

Golang Gin路由 Gin本身是支援restful的,所以可以看一下github所写的范例,使...

[Tableau Public] day 20:制作第三张仪表板

在新增仪表板窗格前,我们先新增一张工作表,名称为「app总数」,我们选择栏位「F1」,度量选择「计数...