14
یک مثال دیگر کپسولهسازی (Encapsulation)
class Car
{
//public
//private
//protected
//internal
private int _speed;
public int Speed
{
get
{
return _speed;
}
set
{
if (value > 120)
{
Console.WriteLine("Bichare mimirihaaaaa ....");
_speed = 0;
}
else
{
_speed = value;
}
}
}
private string _carName = "Pride";
public string CarName
{
get // get فقط خواندی هست و نمی توانید مقدار دهید
{
return _carName;
}
}
}
و در کلاس Program
class Program
{
static void Main(string[] args)
{
Car pride = new Car();
pride.Speed = 120;
//pride.CarName = "Peykan";
// get فقط خواندی هست و نمی توانید مقدار دهید
Console.WriteLine($"Car Name Is : {pride.CarName}");
Console.WriteLine($"Speed Is {pride.Speed}");
Console.ReadKey();
}
15
در سی شارپ، Property یا ویژگی، عضوی از یک کلاس است که برای تنظیم و دریافت دادهها از یک فیلد داده (یعنی متغیر) استفاده میشود. Properties به ما این امکان را میدهند که به شیوهای کنترلشده به فیلدهای کلاس دسترسی پیدا کنیم و از دسترسی نامناسب به آنها جلوگیری کنیم.
ساختار یک Property در سی شارپ شامل دو بخش اصلی است: get و set. بخش get برای بازیابی مقدار Property و بخش set برای تنظیم مقدار آن استفاده میشود.
16
در سی شارپ، GenericList یا به طور دقیقتر List<T>، یک مجموعه عمومی (generic) است که میتواند انواع مختلف دادهها را ذخیره کند. این نوع لیست در فضای نام System.Collections.Generic قرار دارد و به شما اجازه میدهد تا مجموعهای از اشیاء را به صورت نوع مشخص ذخیره کنید.
ویژگیهای List<T>:- نوع عمومی: List<T> میتواند حاوی عناصری از نوع مشخص باشد و چک کردن نوع در زمان کامپایل را فراهم میکند.
- دسترسی با ایندکس: میتوانید به عناصر لیست با استفاده از ایندکس دسترسی داشته باشید، مانند myList[0].
- افزودن و حذف عناصر: میتوانید از متدهای Add(), AddRange(), Insert(), Remove(), و RemoveAt() برای مدیریت عناصر لیست استفاده کنید.
- پشتیبانی از LINQ: List<T> از پرس و جوهای LINQ پشتیبانی میکند که به شما اجازه میدهد تا به راحتی دادهها را جستجو و فیلتر کنید.
مثال:
// ایجاد یک لیست از اعداد صحیح
List<int> primeNumbers = new List<int> { 2, 3, 5, 7, 11 };
// افزودن یک عنصر به لیست
primeNumbers.Add(13);
// دسترسی به یک عنصر با استفاده از ایندکس
int firstPrime = primeNumbers[0]; // خروجی: 2
// حذف یک عنصر از لیست
primeNumbers.Remove(5);
//حذف یک ایندکس آرایه
primeNumbers.RemoveAt(0);
// استفاده از LINQ برای فیلتر کردن عناصر
var evenNumbers = primeNumbers.Where(n => n % 2 == 0).ToList();
این مثال نشان میدهد که چگونه میتوانید یک لیست ایجاد کنید، عناصر را به آن اضافه کنید، به عناصر دسترسی پیدا کنید، و از LINQ برای فیلتر کردن دادهها استفاده کنید.
17
مثال دیگر در GenericList
List<string> Names = new List<string>();
Names.Add("Iman");
Names.Add("TopLearn");
Names.Add("Barnamenevisan");
Names.Add("Ali");
Names.Add("themeShop");
foreach (string name in Names)
{
Console.WriteLine($"Name Is : {name}");
}
Console.ReadKey();
18
در زبان برنامهنویسی سی شارپ، اینترفیس (Interface) یک قرارداد است که تعیین میکند یک کلاس باید چه ویژگیها و روشهایی را پیادهسازی کند. اینترفیسها شامل متدها، ویژگیها و رویدادها هستند که فقط اعلان میشوند و پیادهسازی آنها بر عهده کلاسهای مشتق شده است.
برای تعریف یک اینترفیس از کلمه کلیدی interface استفاده میشود. به عنوان مثال:
public interface ITransactions
{
void ShowTransaction();
double GetAmount();
}
و برای پیادهسازی اینترفیس در یک کلاس:
public class Transaction : ITransactions
{
private string tCode;
private string date;
private double amount;
public Transaction(string c, string d, double a)
{
tCode = c;
date = d;
amount = a;
}
public double GetAmount()
{
return amount;
}
public void ShowTransaction()
{
Console.WriteLine($"Transaction: {tCode}");
Console.WriteLine($"Date: {date}");
Console.WriteLine($"Amount: {GetAmount()}");
}
}
این مثال نشان میدهد که چگونه یک کلاس میتواند از یک اینترفیس ارثبری کند و متدهای آن را پیادهسازی کند.
19
تفاوتهای اصلی بین اینترفیس و کلاس در سی شارپ به شرح زیر است:
1- تعریف و پیادهسازی:
- اینترفیس: فقط شامل اعلان متدها، ویژگیها و رویدادها است و پیادهسازی آنها بر عهده کلاسهایی است که از اینترفیس ارثبری میکنند.
- کلاس: شامل اعلان و پیادهسازی متدها، ویژگیها و رویدادها است.
2- ارثبری:
- اینترفیس: یک کلاس میتواند از چندین اینترفیس ارثبری کند که به آن چندگانهارثبری میگویند.
- کلاس: یک کلاس فقط میتواند از یک کلاس دیگر ارثبری کند (ارثبری تکگانه).
3- ایجاد شیء:
- اینترفیس: نمیتوان از اینترفیسها شیء ایجاد کرد.
- کلاس: میتوان از کلاسها شیء ایجاد کرد.
4- دسترسی به اعضا:
- اینترفیس: اعضای اینترفیس به صورت پیشفرض عمومی (public) هستند و نمیتوانند شامل فیلدهای خصوصی یا محافظتشده باشند.
- کلاس: اعضای کلاس میتوانند دارای سطوح دسترسی مختلفی مانند خصوصی (private)، محافظتشده (protected) و عمومی (public) باشند.
به عنوان مثال، در کد زیر یک اینترفیس و یک کلاس را مشاهده میکنید:
public interface IExample
{
void MethodA();
}
public class ExampleClass : IExample
{
public void MethodA()
{
Console.WriteLine("MethodA implementation");
}
}
در این مثال، ExampleClass از اینترفیس IExample ارثبری کرده و متد MethodA را پیادهسازی کرده است.
20
یک مثال
اینترفیس
namespace ConsoleApp5
{
internal interface IMyInterface
{
string HelloUser(string name);
}
}
کلاس Person
namespace ConsoleApp5
{
class Person:IMyInterface
{
public string HelloUser(string name)
{
return "Hello " + name;
}
}
}
و کلاس Program
namespace ConsoleApp5
{
class Program
{
static void Main(string[] args)
{
Person hi = new Person();
Console.WriteLine(hi.HelloUser("alireza panahi"));
Console.ReadKey();
}
}
}
21
در اینجا می توانیم اینترفیس interface را انتخاب کرد
22
چند ریختی (Polymorphism) در سی شارپ به معنای توانایی یک شیء برای ایفای نقشهای مختلف است. این مفهوم به دو نوع اصلی تقسیم میشود: چند ریختی استاتیک و چند ریختی پویا.
چند ریختی استاتیکدر چند ریختی استاتیک، نوع تابع در زمان کامپایل مشخص میشود. دو روش اصلی برای پیادهسازی چند ریختی استاتیک در سی شارپ عبارتند از:
- Function Overloading: تعریف چندین تابع با نام یکسان اما با پارامترهای متفاوت.
- Operator Overloading: تعریف مجدد عملگرها برای استفاده با انواع دادههای سفارشی.
مثال:
using System;
namespace PolymorphismApplication {
class Printdata {
void print(int i) {
Console.WriteLine("Printing int: {0}", i);
}
void print(double f) {
Console.WriteLine("Printing float: {0}", f);
}
void print(string s) {
Console.WriteLine("Printing string: {0}", s);
}
static void Main(string[] args) {
Printdata p = new Printdata();
p.print(5);
p.print(500.263);
p.print("Hello C#");
Console.ReadKey();
}
}
}
چند ریختی پویادر چند ریختی پویا، نوع تابع در زمان اجرا مشخص میشود. این نوع چند ریختی معمولاً با استفاده از کلاسهای abstract و اینترفیسها پیادهسازی میشود.
مثال:
using System;
namespace PolymorphismApplication {
abstract class Shape {
public abstract int area();
}
class Rectangle : Shape {
private int length;
private int width;
public Rectangle(int a = 0, int b = 0) {
length = a;
width = b;
}
public override int area() {
Console.WriteLine("Rectangle class area:");
return (width * length);
}
}
class RectangleTester {
static void Main(string[] args) {
Rectangle r = new Rectangle(10, 7);
double a = r.area();
Console.WriteLine("Area: {0}", a);
}
}
}
این مثالها نشان میدهند که چگونه میتوان از چند ریختی برای ایجاد کدهای انعطافپذیر و قابل توسعه استفاده کرد.
23
اینترفیسها (Interfaces) در سی شارپ نقش مهمی در پیادهسازی چند ریختی (Polymorphism) دارند. اینترفیسها به شما اجازه میدهند تا قراردادهایی را تعریف کنید که کلاسها باید از آنها پیروی کنند. این ویژگی به شما امکان میدهد تا کدهای انعطافپذیر و قابل توسعهای بنویسید.
تعریف اینترفیساینترفیسها شامل اعلان متدها و خواص هستند، اما هیچ پیادهسازیای ندارند. کلاسهایی که از اینترفیسها ارثبری میکنند، باید تمامی متدها و خواص تعریفشده در اینترفیس را پیادهسازی کنند.
مثال:
using System;
namespace InterfaceExample {
interface IShape {
int Area();
}
class Rectangle : IShape {
private int length;
private int width;
public Rectangle(int l, int w) {
length = l;
width = w;
}
public int Area() {
return length * width;
}
}
class Circle : IShape {
private int radius;
public Circle(int r) {
radius = r;
}
public int Area() {
return (int)(Math.PI * radius * radius);
}
}
class Program {
static void Main(string[] args) {
IShape rect = new Rectangle(10, 7);
IShape circ = new Circle(5);
Console.WriteLine("Rectangle Area: " + rect.Area());
Console.WriteLine("Circle Area: " + circ.Area());
}
}
}
چند ریختی با اینترفیسهادر این مثال، اینترفیس IShape تعریف شده است که شامل متد Area است. کلاسهای Rectangle و Circle اینترفیس IShape را پیادهسازی میکنند و متد Area را به صورت خاص خودشان تعریف میکنند. در برنامه اصلی، میتوانیم از نوع IShape برای نگهداری اشیاء مختلف استفاده کنیم و متد Area را بدون توجه به نوع دقیق شیء فراخوانی کنیم. این ویژگی همان چند ریختی است که به ما اجازه میدهد تا با اشیاء مختلف به صورت یکسان رفتار کنیم.