C#入門-Day8:物件導向

閱讀時間約 16 分鐘

類別(Class)

類別是 C# 中的基本構造,用於封裝數據和行為。類別是對象的藍圖,可以包含字段、屬性、方法和事件。

using System;

public class Person
{
// 字段
private string name;
private int age;

// 屬性
public string Name
{
get { return name; }
set { name = value; }
}

public int Age
{
get { return age; }
set { age = value; }
}

// 方法
public void Greet()
{
Console.WriteLine($"Hello, my name is {name} and I am {age} years old.");
}
}

public class Program
{
public static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice";
person.Age = 30;
person.Greet(); // Output: Hello, my name is Alice and I am 30 years old.
}
}

繼承(Inheritance)

繼承允許類別從另一個類別派生,繼承其字段和方法。C# 支持單繼承,但可以實現多個介面。

using System;

public class Animal
{
public void Eat()
{
Console.WriteLine("Eating...");
}
}

public class Dog : Animal
{
public void Bark()
{
Console.WriteLine("Barking...");
}
}

public class Program
{
public static void Main(string[] args)
{
Dog dog = new Dog();
dog.Eat(); // Output: Eating...
dog.Bark(); // Output: Barking...
}
}

多型(Polymorphism)

多型允許對象通過父類或介面類型來呼叫方法,行為由實際對象決定。這通常通過方法重寫(override)實現。

using System;

public class Animal
{
public virtual void Speak()
{
Console.WriteLine("Animal sound");
}
}

public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Bark");
}
}

public class Program
{
public static void Main(string[] args)
{
Animal animal = new Dog();
animal.Speak(); // Output: Bark
}
}

封裝(Encapsulation)

封裝是將數據和方法封裝在類別內部,通過屬性和方法來控制對它們的訪問。

using System;

public class Account
{
private double balance;

public double Balance
{
get { return balance; }
private set { balance = value; }
}

public void Deposit(double amount)
{
if (amount > 0)
{
Balance += amount;
}
}

public void Withdraw(double amount)
{
if (amount > 0 && amount <= Balance)
{
Balance -= amount;
}
}
}

public class Program
{
public static void Main(string[] args)
{
Account account = new Account();
account.Deposit(100);
account.Withdraw(30);
Console.WriteLine(account.Balance); // Output: 70
}
}

介面(Interface)

介面定義了成員的簽名,不包含實現。類別可以實現介面,提供這些成員的具體實現。

using System;

public interface IAnimal
{
void Speak();
}

public class Dog : IAnimal
{
public void Speak()
{
Console.WriteLine("Bark");
}
}

public class Program
{
public static void Main(string[] args)
{
IAnimal animal = new Dog();
animal.Speak(); // Output: Bark
}
}

抽象類別(Abstract Class)

抽象類別不能實例化,可以包含抽象方法(無實現)和具體方法(有實現)。子類必須實現所有抽象方法。

using System;

public abstract class Animal
{
public abstract void Speak();
public void Eat()
{
Console.WriteLine("Eating...");
}
}

public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Bark");
}
}

public class Program
{
public static void Main(string[] args)
{
Dog dog = new Dog();
dog.Speak(); // Output: Bark
dog.Eat(); // Output: Eating...
}
}

靜態類別(Static Class)

靜態類別不能實例化,所有成員都必須是靜態的,常用於工具類或擴展方法。

using System;

public static class MathHelper
{
public static int Add(int a, int b)
{
return a + b;
}
}

public class Program
{
public static void Main(string[] args)
{
int result = MathHelper.Add(3, 4);
Console.WriteLine(result); // Output: 7
}
}

列舉(Enumerations)

列舉是一種特殊的數據類型,包含一組命名常數。

using System;

public enum DaysOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}

public class Program
{
public static void Main(string[] args)
{
DaysOfWeek today = DaysOfWeek.Monday;
Console.WriteLine(today); // Output: Monday
}
}

委派(Delegates)

委派是一種類型安全的函數指標,允許方法作為參數傳遞。

using System;

public class Program
{
public delegate void PrintDelegate(string message);

public static void PrintMessage(string message)
{
Console.WriteLine(message);
}

public static void Main(string[] args)
{
PrintDelegate del = PrintMessage;
del("Hello, delegate!"); // Output: Hello, delegate!
}
}

Lambda 表達式

Lambda 表達式是匿名函數,用於簡潔地表示委派或表達式樹。

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
public static void Main(string[] args)
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2 4
}
}
}

泛型(Generics)

泛型允許類別、介面和方法在聲明時不指定特定的數據類型,增加了代碼的重用性和類型安全性。

using System;

public class GenericList<T>
{
private T[] elements;
private int count;

public GenericList(int size)
{
elements = new T[size];
count = 0;
}

public void Add(T element)
{
if (count < elements.Length)
{
elements[count++] = element;
}
}

public T GetElement(int index)
{
if (index < count)
{
return elements[index];
}
throw new IndexOutOfRangeException();
}
}

public class Program
{
public static void Main(string[] args)
{
GenericList<int> intList = new GenericList<int>(5);
intList.Add(1);
intList.Add(2);
Console.WriteLine(intList.GetElement(1)); // Output: 2
}
}

反射(Reflection)

反射允許在運行時檢查和操作類型的元數據。

using System;
using System.Reflection;

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Greet()
{
Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
}
}

public class Program
{
public static void Main(string[] args)
{
Type type = typeof(Person);
Console.WriteLine($"Class: {type.Name}");

PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
Console.WriteLine($"Property: {property.Name}");
}

MethodInfo method = type.GetMethod("Greet");
Console.WriteLine($"Method: {method.Name}");

object person = Activator.CreateInstance(type);
type.GetProperty("Name").SetValue(person, "Alice");
type.GetProperty("Age").SetValue(person, 30);
method.Invoke(person, null); // Output: Hello, my name is Alice and I am 30 years old.
}
}

    6會員
    77內容數
    日後將分享關於我的經驗(日常、工作、技術),並期待未來能創造屬於我的宇宙。
    留言0
    查看全部
    發表第一個留言支持創作者!
    Michael楊 的其他內容
    C#入門-Day3:環境建置
    閱讀時間約 2 分鐘
    C#入門-Day4:資料型別
    閱讀時間約 9 分鐘
    C#入門-Day5:運算符
    閱讀時間約 1 分鐘
    C#入門-Day6:流程控制
    閱讀時間約 4 分鐘
    C#入門-Day7:函數
    閱讀時間約 14 分鐘
    你可能也想看
    2024 虛擬實境 x 人因設計 05unity C#語法教學入門_2完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
    Thumbnail
    avatar
    Gavin Hsieh
    2024-04-24
    C計算(一)高中數學主題練習—C計算(一)
    Thumbnail
    avatar
    WilliamP
    2024-04-07
    提升效率!在C#輸入資訊時自動切換中文輸入法的兩種方法在進行資訊輸入的過程中,經常需要在不同語言的文字之間切換輸入法,這可能會影響效率。不過,透過程式設計的方法,我們可以實現在選取到需要輸入中文的輸入框時自動切換到中文輸入法,讓操作更加便利。在這篇文章中,我們將介紹兩種實現自動切換中文輸入法的方法,一種是切換輸入法,另一種是使用IME輸入法。
    Thumbnail
    avatar
    Pochi
    2024-02-02
    C當我的自營工作室客源開始穩定時,C就這樣悄悄走進我的生命裡,至今為止,我和C從來沒有吵架過,連一點點的不愉快、疙瘩甚至懷疑都沒有,對我而言,C的意義只有美好。她總是希望我過得好,我也祝福她永遠快樂。     我的租屋處是一棟由五樓透天隔間的大套房,而我就住在頂樓,旁邊還有一間空房一直沒人承租
    Thumbnail
    avatar
    小倖
    2024-01-12
    [C#] 讀取和寫入JSON文件JSON(JavaScript Object Notation)是一種常用的數據交換格式,用於在不同的應用程序之間傳遞結構化數據。在C#中,我們可以使用Newtonsoft.Json模組來處理JSON資料。
    Thumbnail
    avatar
    Pochi
    2023-08-14
    【入門級】-C#介紹一、C#介紹 二、為什麼要學C# 三、.NET Framework介紹
    Thumbnail
    avatar
    橙果杏
    2023-03-19
    C發洩完情緒之後,內心裡,總會有一種抒坦。是那種放下的感覺,是那種,什麼都好,都可以不重要,只有自己的那種,唯我獨尊的快感。可以不必再在意些什麼,不必再掙扎著去要求些什麼。唯有放寛心了,才能更真實去體驗自己正在經歷的過程。放下些什麼,才能獲得些什麼。 昨晚,C因為工作無法前來陪伴休假的我。經前症候群嚴
    Thumbnail
    avatar
    霍普
    2022-11-17
    Untiy C# | Input 官方的輸入偵測這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
    Thumbnail
    avatar
    瓶裝雪
    2022-07-29
    C語言 輸入、輸出(input/output I/O)前言 輸出 printf 格式控制字元、格式控制符(format char) 前言 輸出控制字元、輸出控制符 轉義字元、轉義符 格式控制字元、格式控制符 輸入 scanf gets gets與scanf差異
    Thumbnail
    avatar
    Caffeine 咖啡因
    2022-07-07