دوره آموزشی #C-قسمت 18 - Static Classes
وراثت یکی از مفاهیم اصلی در برنامه نویسی شی گرا است. وراثت به یک کلاس اجازه می دهد تا از کلاس دیگر ارث ببرد.
ارث بردن از یک کلاس به شما این امکان را می دهد که به جای ساختن آن از ابتدا، از عملکرد کلاس استفاده مجدد کنید.
سی شارپ به یک کلاس اجازه می دهد فقط از یک کلاس ارث بری کند. به این single inheritance می گویند. سی شارپ از multiple inheritances پشتیبانی نمی کند که یک کلاس بتواند از دو یا چند کلاس ارث بری کند.
یک کلاس Person با ویژگی های FirstName، LastName، Age و FullName و متد ()Introduce را در نظر بگیرید:
class Person { public string FirstName { get; set; } public string LastName { get; set; } public byte Age { get; set; } public string FullName => ${FirstName} {LastName}; public string Introduce() => $Hi, Im {FullName}.; }
و شما می خواهید یک کلاس Employee تعریف کنید که تمام خصوصیات را به عنوان کلاس Person و دو ویژگی دیگر JobTitle و Salary داشته باشد.
به جای کپی کد از کلاس Person به کلاس Employee، می توانید از وراثت استفاده کنید.
مثال پایین زیر کلاس Employee را که از کلاس Person به ارث می برد تعریف می کند:
class Employee: Person { }
در این مثال:
از آنجایی که کلاس Employee خصوصیات و متدهای کلاس Person را به ارث می برد، اشیاء آن مانند اشیاء کلاس Person رفتار می کنند. مثلا:
var employee = new Employee { FirstName = reza, LastName = mohamadi, Age = 25 }; Console.WriteLine(employee.Introduce());
همانطور که می بینید، Employee مانند کلاس Person بدون تکرار کد رفتار می کند. ما می گوییم employee
یک Person است و وراثت یک رابطه is-a است.
درک مفهوم رابطه IS-A و HAS-A بین کلاس ها بسیار مهم است. اجازه دهید با یک مثال رابطه IS-A و HAS-A را در سی شارپ درک کنیم.
class Rectangle{ Some Data Members Some Member Functions }
این کلاسی به نام Rectangle است. اجازه دهید داده ها را فرض کنیم که در داخل این کلاس چند عضو داده و توابع عضو داریم. در مرحله بعد کلاسی به نام Cuboid داریم که از کلاس Rectangle فوق به صورت زیر ارث
می برد:
class Cuboid : Rectangle{ Some Data Members Some Member Functions }
همچنین فرض کنید که این کلاس چند عضو داده و توابع عضو نیز در داخل خود دارد. حال اجازه دهید یک کلاس دیگر را به صورت زیر بنویسیم:
class Table{ Rectangle top; int legs; }
بنابراین ابتدا یک کلاس به نام Rectangle ایجاد کرده ایم. سپس کلاس دیگری به نام Cuboid ایجاد کردیم که از کلاس Rectangle به ارث رسیده است و سپس کلاس دیگری به نام Table ایجاد کردیم. در داخل کلاس Table یک متغیر از نوع Rectangle و همچنین متغیر دیگری از نوع عدد صحیح ایجاد کرده ایم.
کلاس Cuboid از کلاس Rectangle ارث بری می کند . بنابراین، آیا می توانیم بگوییم که یک Cuboid یک Rectangle است؟ بله.
بنابراین، رابطه بین کلاس Rectangle و کلاس Cuboid رابطه Is-A است.
بنابراین، نکته ای که باید به خاطر بسپارید این است که هر زمان که ما رابطه Inheritance یا رابطه والد-فرزند را ایجاد می کنیم، می توانیم آن رابطه را به عنوان یک رابطه IS-A در زبان های برنامه نویسی شی گرا بگوییم.
در ادامه بعد، کلاس Table ما، دارای یک متغیر به نام top است که از نوع Rectangle است. یعنی کلاس Table دارای یک شی از کلاس Rectangle است. بنابراین، آیا می توانیم بگوییم که کلاس Table دارای یک Rectangle است؟ بله، کلاس Table دارای یک Rectangle است. بنابراین، رابطه بین کلاس Table و کلاس Rectangle، رابطه Has A است.
بنابراین، یک کلاس در سی شارپ به دو صورت قابل استفاده است. یک راه استفاده از رابطه Inheritance است، یعنی یک کلاس از آن کلاس ارث می برد. روش دوم این است که شما می توانید یک شی از آن کلاس ایجاد کنید و از آن استفاده کنید.
مثالی برای درک رابطه IS-A در سی شارپ :
به مثال زیر نگاهی بیندازید. در مثال زیر، رابطه بین Rectangle و Cuboid رابطه IS-A است، بنابراین می توان گفت که Cuboid IS-A Rectangle است :
public class Program { static void Main() { Cuboid cuboid = new Cuboid(3, 5, 7); Console.WriteLine($Volume is : {cuboid.Volume()}); Console.WriteLine($Area is : {cuboid.Area()}); Console.WriteLine($Perimeter is : {cuboid.Perimeter()}); Console.ReadKey(); } } class Rectangle { //Data Members public int Length; public int Breadth; //Member Functions public int Area() { return Length * Breadth; } public int Perimeter() { return 2 * (Length + Breadth); } } class Cuboid : Rectangle { public int Height; public Cuboid(int l, int b, int h) { Length = l; Breadth = b; Height = h; } public int Volume() { return Length * Breadth * Height; } }
مثالی برای درک رابطه HAS-A در سی شارپ :
به مثال زیر نگاهی بیندازید. در مثال زیر، در کلاس Employee، یک متغیر از نوع Address ایجاد کردهایم که چیزی جز یک رابطه HAS-A بین Employee و Address نیست. بنابراین، می توان گفت که
Employee has-A Address.
public class Program { static void Main() { Address address = new Address(20, tehran, vanak); Employee employee = new Employee(10, reza mohamadi, address); employee.Display(); Console.ReadKey(); } } class Address { public string AddressLine, City, State; public Address(string addressLine, string city, string state) { AddressLine = addressLine; City = city; State = state; } } class Employee { public Address address; public int Id; public string Name; public Employee(int id, string name, Address adrs) { Id = id; Name = name; address = adrs; } public void Display() { Console.WriteLine($Employee Id: {Id}); Console.WriteLine($Employee Name: {Name}); Console.WriteLine($AddressLine: {address.AddressLine}); Console.WriteLine($City: {address.City}); Console.WriteLine($State: {address.State}); } }
در مثال بالا، اگر کلاس Employee را از کلاس Address به ارث ببریم، معنی ندارد. زیرا اگر ارث ببریم، یک رابطه IS-A بین کلاس های کارمند و آدرس برقرار می کند و گفتن Employee IS-A Address منطقی نیست، بلکه اگر رابطه HAS-A را پیاده سازی کنیم، منطقی است که بگوییم Employee HAS-A address.
کد زیر ویژگی JobTitle و Salary را به کلاس Employee اضافه می کند:
class Employee : Person { public string JobTitle { get; set; } public decimal Salary { get; set; } }
اکنون کلاس Employee دارای ویژگی های خاص خود و ویژگی های ارثی از کلاس Person است. مثال زیر یک نمونه جدید از کلاس Employee با تمام ویژگی ها ایجاد می کند:
var employee = new Employee { FirstName = reza, LastName = mohamadi, Age = 18, JobTitle = C# Developer, Salary = 5000 }; Console.WriteLine(employee.Introduce());
بیشتر بخوانید : دوره آموزشی #C-قسمت 20 - Inheritance & Constructor
بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core