Skip to main content

در آموزش پیشین، در مورد ساخت کلاس و افزودن متد، بحث کردیم. در این آموزش، میخواهیم کمی آموزش را تعمیم دهیم، و درباره ارث بری صحبت کنیم. در آموزش قبلی، یک کلاس کاربر به این شکل تهیه کردیم :

class User
 def initialize(username, password)
  @username = username
  @password = password
 end
 def print_info
  puts "username: #{@username}"
  puts "password: #{@password.length * "*"}"
 end
end

بیایید یک برنامه بزرگ را در نظر بگیریم، مثلا قرار است از کاربرها، عده ای را به عنوان ادمین انتخاب کنیم، و عده ای را به عنوان ویرایشگر. باید چه کنیم؟ اولین راهی که به ذهن برنامه نویس تازه کار میرسد، نوشتن کلاس ادمین و ویرایشگر از صفر است. اما بیاید از ویژگی «ارث بری» یا Inheritance در روبی بهره ببریم.

نوشتن کلاس ویرایشگر و ادمین

همه زبان های شی گرا از ارث بری پشتیبانی میکنند. بیایید برسیم به این که در روبی، چگونه میتوان یک کلاس فرزند نوشت. کلاس والد ما، در این آموزش کلاس User است. کاربر عمومی، با گرفتن مجوزهایی تبدیل به ویرایشگر یا ادمین می شوند. به شکل زیر، کلاس خالی ادیتور را ایجاد میکنیم.

class Editor < User
end

باید مجوز های خاصی را به کلاس ویرایشگر اضافه کنیم. مثلا بگوییم میتواند ویرایش کند یا نه؟ میتواند کاربری را اضافه و حذف کند و … ! بیاییم با متد permissions مجوز ها را مشخص کنیم :

class Editor < User
 def permissions
  puts "Can Edit, Add and Remove Articles"
 end
end

و به همین ترتیب، کلاس ادمین را هم میسازیم :

class Admin < User
 def permissions
  puts "Can Edit, Add, Remove all Articles and Users"
 end
end

بدین شکل، کاربر ادمین هم ساختیم. حال سوال پیش می آید چگونه میتوان کلاس ها را به یکدیگر تبدیل نمود؟ مثلا کاربر عادی را به ادمین، ادیتور و ادمین را به یکدیگر و … ؟ در ادامه با ما باشید.

تبدیل نوع کلاس ها

ما اکنون سه کلاس Admin و Editor و User را داریم. برای این که این کلاس ها را به یکدیگر تبدیل کنیم باید چه کنیم؟ دقت کنید که نحوه تبدیل به این شکل است که کاربر، به ویرایشگر و ادمین؛ ادمین به کاربر و ویرایشگر ؛ و ویرایشگر به کاربر و ادمین تبدیل می شود. در واقع تبدیل نوع کلاس باید به این شکل باشد که کلاس جدیدی از نوع مورد نظر ما ایجاد شده، و اطلاعات آن منتقل شود. نمونه کد زیر، تبدیل کننده کاربر به ویرایشگر و ادمین است :

class User
 def initialize(username, password)
  @username = username
  @password = password
 end
 def print_info
  puts "username: #{@username}"
  puts "password: #{@password.length * "*"}"
 end
 def to_editor
  Editor.new(@username, @password)
 end
 def to_admin
  Admin.new(@username, @password)
 end
end

و به همین ترتیب، می توانید این متدها را برای دو نوع کاربر دیگر هم بنویسید ( که به علت طولانی شدن مطلب، از نوشتن آنها صرف نظر کردیم).

تا اینجا، با دو تا از مهم ترین تکنیک های شی گرایی در روبی آشنا شدیم. در آینده، سایر روش ها و تکنیک های برنامه نویسی شی گرا در روبی را نیز فراخواهیم گرفت.

در کتاب آموزش روبی، در فصل آخر، خرده توضیحاتی را درباره شی گرایی در روبی آورده‌ایم، اما آن توضیحات برای کسی که بخواهد کد شی‌گرای واقعی بنویسد، کافی نیست. بنابراین، تصمیم بر آن شد تا در سلسله مقالاتی در این وبگاه، شی گرایی و برنامه نویسی پیشرفته در روبی را بررسی کنیم. در فصل آخر کتاب، به قدر کافی به مفاهیم تئوری شی گرایی (چهار مفهوم انتزاع، وراثت، چند ریختی و کپسوله سازی) پرداخته ایم، بنابراین از این مقاله، به صورت عملی مفاهیم مختلف را در روبی بررسی میکنیم.

ساختار کلی کلاس ها در روبی

کلاس ها در روبی به این شکل ساخته می شوند :

class Name
end

توجه داشته باشید که نام کلاس ها، حتما باید مانند ثوابت با حرف بزرگ انگلیسی شروع شود. مثلا اگر کلاس شما، کلاس Animal است، نمی توانید آن را به شکل animal نام گذاری کنید. در فاصله بین نام کلاس تا end ، متدهای یک کلاس را قرار میدهیم. مهم ترین متد هر کلاس، متد initialize است، که کلاس را مقداردهی اولیه میکند. برای مثال کلاس User را با دو مقدار اولیه username و password در نظر بگیرید :

class User
 def initialize(username, password)
  @username = username
  @password = password
 end
end

متغیرهایی که با @ شروع می شوند، متغیر های instance هستند، بدون دادن مقدار کافی به این متغیرها، کلاس(های) شما، ایجاد نمی شوند. به این شکل، یک شی از کلاس User ایجاد می کنیم :

user = User.new("username", 123456)

با استفاده از متد new ، مقدار دهی اولیه را انجام میدهیم. اما هنوز متدی در نظر نگرفته ایم که با استفاده از آن، بتوانیم یوزرنیم کاربر را دریافت کنیم، و پسورد کاربر را به شکل **** نشان دهیم، برای این کار، متد print_info را در کلاس User تعریف میکنیم.

class User
 def initialize(username, password)
  @username = username
  @password = password
 end
 def print_info
  puts "username: #{@username}"
  puts "password: #{@password.length * "*"}
 end
end

اکنون، متد مورد نظر ما قابلیت اجرایی شدن را داراست. پس با استفاده از print_info نتیجه مطلوب را دریافت خواهیم کرد.

توجه داشته باشید که این مقاله، آموزش ابتدایی و پایه‌ای برنامه سازی پیشرفته در روبی بود، در مقالات آینده، از امکانات بیشتری استفاده خواهیم نمود.