تا حالا شده در زبان شی گرا از class func استفاده کنی؟


سلام

خوشحالم که دوباره فرصت پیدا کردم تا یک مطلب فوق العاده دیگه باهاتون به اشتراک بگذارم.

توی زبان swift ما یک چیزی داریم به اسم class func که متفاوت از سینتکس هایی است که تا حالا در زبان های شی گرا خوندیم.می خوام این مفهوم رو در زبان های سوئیفت و دارت و کاتلین و جاوا بررسی کنم.

class A {
  class func firstFunction()  -> String{
      return &quot first &quot}
  func secondFunction ()  -> String{
       return &quot second &quot
}
}


اما قبلش یک سری تعریف های ساده رو باهم مرور می کنیم.


تعریف class :داخل کلاس می تونیم متغیر ها و متدها رو تعریف کنیم

تعریف enum : می تونیم به وسیله enum یک type با مقادیر دلخواه بسازیم و از اونها استفاده کنیم. enum ها را نمی توانیم به ارث ببریم.

سینتکس enum هم به این شکل بود.

  • در زبان سوئیفت :
enum Gender {
    case female
    case male  
}
  • در زبان دارت :
enum Gender {
    female , male 
}
  • در زبان کاتلین البته enum ها از نوع کلاس هستند:
enum class Gender {
    FEMALE , MALE  
}
  • در زبان جاوا :
enum Gender {
    FEMALE , MALE 
 }


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

Gender.female یا Gender.FEMALE

برای مدل سازی در زبان های مختلف هم یک سری مفاهیم داریم.

  • مدل سازی در زبان سوئیفت از طریق structure ها انجام میشه که با کلیدstruct مشخص میشه .اینکه فرق struct با class چیست و چرا در سوئیفت برای مدل سازی از کلاس استفاده نمی کنیم نیاز به توضیحات زیادی داره که توی این پست دربارش حرف نمی زنم اما لازمه بدونید که struct ها را نمی توانیم ارث ببریم.در struct و حتی enum ها یک کپی از آنها پاس داده می شود اما در کلاس ها رفرنس پاس داده می شود.
struct Person{
      var name =  &quot your name &quot
      init(name:String){
            self.name=name
}
}
  • مدل سازی در زبان کاتلین از طریق data class بجای class استفاده می کنیم.
data class Person(val name : String) 
  • مدل سازی در زبان دارت تقریبا مثل زبان جاوا است و از کلاس استفاده می کنیم.
class Person {
    final name String;
    Person({
         required this.name
}
);
}

خب حالا که تا اینجا اومدیم بریم دوتا مفهوم دیگه که در ادامه بهش نیاز داریم را مرور کنیم.

  • تعریف Instance methods :

به متد ها یا همون function هایی که در class , struct , enum استفاده می کنیم instance method گفته می شود.در این متد ها می توانیم به بقیه متغیر ها و متدهای دیگه در کلاس دسترسی داشته باشیم.

class Counter {
    var count = 0
    func increment() {
        count += 1
}
     func increment(by amount: Int) {
           count += amount
}
     func reset() {
           count = 0
}
}

هر سه متد از نوع instance method هستند. از طریق شی کلاس Counter به instance method ها دسترسی پیدا می کنیم و در واقع یک instance از type خاص هستند.به عبارتی این متدها متعلق به شی کلاس هستند .

let counter = Counter()
// the initial counter value is 0
counter.increment()
// the counter's value is now 1
counter.increment(by: 5)
// the counter's value is now 6
counter.reset()
// the counter's value is now 0
  • تعریف Type methods :

برخلاف instance method که شما از طریق یک type خاص آنها را فراخوانی می کردید در اینجا متدها از طریق type خودشان صدا زده می شوند. در بیشتر زبان ها برای نشان دادن این نوع متد ها کلید static استفاده می کنیم.این متد ها متعلق به کلاس هستند.

class SomeClass {
  class func someTypeMethod() {
// type method implementation goes here
}
   static func someType(){
}
}
//call :
SomeClass.someTypeMethod()
SomeClass.someType()

همانطور که می بینید در سوئیفت ما به دو روش می توانیم type method بسازیم که به یک شکل metaType هم فراخوانی شده اند.اما واقعا تفاوت در چیست؟!

یک تفاوت جالب وجود دارد. شما نمی توانید متد های استاتیک را توسط کلاس دیگه به ارث ببرید.

یعنی متد someType قابل ارث بری نیست.

پس برای اینکه هم متد استاتیک داشته باشید و هم بتوانید آنرا به فرزند کلاس بدهید باید از کلید های class func برای اینکار استفاده کنید.

یادآوری کنم که اگر می خواستید یک property در type method ها استفاده کنید باید آن property هم از نوع استاتیک تعریف کنید تا در type method به آن دسترسی داشته باشید.
class SomeClass  {
   static var name=&quot Sepehr&quot
   class func someTypeMethod() {
// type method implementation goes here
       name=&quotAhmad&quot
}
    static func someType(){
          name=&quot Ali&quot
}
}

وقتی از کلاس SomeClass ارث بری کنیم داریم :

class  Foo : SomeClass {
  override class func someTypeMethod() {
}
}

طرح یک پرسش : بنظرتون از class func می توانیم در enum و struct استفاده کن

fluentu.com
fluentu.com


اگر جوابت بله است پیشنهاد می کنم یکبار دیگه این پست رو از اول بخونی اگر جوابت خیر است بهت تبریک میگم.

اصلا class func زمانی کاربرد دارد که بخواهیم متد ما هم از نوع استاتیک و هم قابل ارث بری باشد اما در enum ها و struct ها ما ارث بری نداریم.پس در این حالت برای ما کاربردی نیست

اما هنوز می توانیم type method را از طریق کلید static برای enum و struct تعریف کنیم.




حالا که متوجه شدیم class func چه کاربردی در سوئیفت دارد بیایید بررسی کنیم که معادل class func در زبان های دارت و کاتلین و جاوا به چه صورت است؟اصلا شدنی است؟


یکبار دیگه مرور کنیم که در زبان های شی گرا متد های استاتیک قابل ارث بری نیستند.

پس ما نمی تونیم مثل سوئیفت عمل کنیم که هم متد را به صورت metaType صدا بزنیم و هم بتوانیم آن متد را override کنیم و عملا برای class fun معادلی در دارت و جاوا و کاتلین وجود ندارد.




ممنونم که تا آخر این پست با من بودید.خوشحال می شوم اگر موردی هست با من و بقیه به اشتراک بگذارید.

لطفا نظر دهید و با ❤️ کردن از من حمایت کنید.


مراجع :

داکیومنت سوئیفت و stackoverflow.com