D-22 物件 object ? class ? interface

物件 object 是什麽

昨天一直有提到一个关键字物件不过一直没有说明什麽是物件,因为就等着这一篇一起说明,现在就让读者们跟小光一起来了解什麽是物件吧。

本篇同步放置於此

object ? class ? interface

「前辈,昨天听好多物件跟类别然後还有之前说的介面,这些是什麽东西啊。」
今天一早小光就把昨天跟之前听到的然後还不了解的东西全部都在问一遍,然後大头依旧埋首於文件之中,大约过了十分钟大头才抬起头来看了小光一眼,并且问了他一句话。
「究竟在要怎麽做开发才会快,你知道吗?」
显然这问题考倒了小光,因为听了这个问题让小光进入沈思的状态之中。
「昨天教的方法有让你感受到开发变容易了吗?」
「好像比较不用写那多程序码了」
听到大头更进一步的问题後小光很直觉的把感受到东西说出来,而大头听了之後就继续往下说下去。
「是吧,你还记得ctrl+vloop吧,如果今天会使用方法跟类别会让你的开发更顺利,所以我们更进一步了解物件跟类别吧。」

object

首先来说明什麽是物件吧,在c#的变数都是物件,例如之前的intstring也都是物件,其中物件又分为两类ValueTypeReferenceType两类其差异在於处理物件的记忆体的方式不同,其中int这种就是ValueType,所以我们先说明一下这部分。

ValueType

这个ValueType的记忆体是放置於stack内,而且每次异动都会产生一组新记忆体配置,还有例如在方法参数的传入时也是复制一份资料到新的记忆体配置内,所以方法内的异动不会影响到方法外的变数,所以要将原来的那变数传入方法内则需要ref关键字,详细内容如下。

using System;
					
public class Program
{
	private static void Add(int param)
	{
         param++;
	}
	
	private static void AddRef(ref int param)
	{
        param++;
	}
	public static void Main()
	{
		var param = 10;
		Add(param);
		Console.WriteLine(param);
		AddRef(ref param);
		Console.WriteLine(param);
	}
}

struct

这个ValueType除了基础型别外还可以自定义型别结构类型,这时候就要用struct这个关键字,所以实际的写法如下。


using System;
					
public class Program
{
	public static void Main()
	{
		var param = new Vector();
		Console.WriteLine(param);
		param.X++;
		Console.WriteLine(param);
	}
	
	public struct Vector
	{
            public int X;
            public int Y;
		
            public override string ToString()
	    {
                return string.Format("X:{0}, Y:{1}", X, Y);
            }
	}
}

ReferenceType

介绍完ValueType後我们要来介绍ReferenceType,其处理记忆体的方式是将资料放在heap内,而变数内都是记载该资料的记忆体位置,所以传到方法内如果改变期属性或栏位则方法外的变数也会被影响到。而且还有一个特性就是其预设值都是null,其中比较特别的是基础型别中只有stringReferenceType

class

其实说到ReferenceType还有另外一个比较重要的是类别了,至於说到类别就不能不提物件导向设计模式,因为可以透过继承让程序开发更便利。

interface

虽然使用类别已及继承可以带来开发的便利性,但是不当的继承已极直接相依於某类别会造成程序於程序的关联太深,若是类别的异动会直接影响另一个类别的开发,所以这时就要说明介面的重要性,透过has a[介面]可以让类别直接相依於介面,而介面又只是定义方法的参数不涉及实作的内容,所以搭配起来若是实作有变动其实不影响拥有该介面的类别。
说了那麽多以下来展示一下类别has a介面的设计方式。

public IOperator
{
    int Calc(int x, int y);
}

public class Calculator
{
    private IOperator _operator = null;
    public Calculator(IOperator operator)
    {
        _operator = operator;
    }
    
    public int Calc(int x, int y)
    {
        return _operator.Calc(x, y);
    }
}

public class PlusOperator : IOperator
{
    public int Calc(int x, int y)
    {
        return x + y;
    }
}

public class MultiOperator : IOperator
{
    public int Calc(int x, int y)
    {
        return x * y;
    }
}

public static void Main()
{
    // 加法计算机
    var calc = new Calculator(new PlusOperator()); 
    
    // result is 20
    Console.WriteLine(calc.Calc(10, 10));  

    // 乘法计算机
    calc = new new Calculator(new MultiOperator()); 

    // result is 100
    Console.WriteLine(calc.Calc(10, 10));  
}

後记

「前辈,你今天真的说到我头昏眼花了」
小光揉着他的太阳穴一边跟大头这麽说,而大头听到後哈哈大笑,并且这麽对他说。
「我只是说个大概而已,关於介面还有很多没说的,甚至於有些我还需要请到我的前辈跟你介绍IOC呢,不过这是後面的事了,你先吸收一下,并且去了解OOP也就是物件导向设计模式的内容吧。」
所以这一篇物件先到此结束了,敬请期待下一篇的内容。


<<:  css opacity

>>:  常见网路问题(三):为什麽明明连上了 Wi-Fi,却还是上不了网?PPPoE、DHCP 及 Static 的设定

Day 25:从头开始的 Scroll Behavior

目前导览项目页面愈来愈完整,相对有愈来愈多小细节需要留意,尤其是资料量变多时,许多浏览时伴随的滚动效...

Unity自主学习(十三):认识Unity介面(4)

今天继续来熟悉Unity介面~(ง •̀_•́)ง‼ 昨天了解了阶层管理区,今天打算接续着看游戏执行...

[day 19] 在网页端学Swift 以及 SwiftUI入门

发现一个可以在网页端学 Swift的地方-->google colab A Swift Tou...

卡夫卡的藏书阁【Book29】- Kafka - MirroMaker 2

“I need solitude for my writing; not 'like a herm...

Day07 - 套用 Html Helper - 复杂型别 object

这篇开始使用 Html Helper 来 Render 出需要的 Html 控制项 name,方便在...