F # - Kalıtım

Nesne yönelimli programlamadaki en önemli kavramlardan biri kalıtımdır. Kalıtım, bir sınıfı başka bir sınıf açısından tanımlamamıza izin verir, bu da bir uygulamayı oluşturmayı ve sürdürmeyi kolaylaştırır. Bu aynı zamanda kod işlevselliğini ve hızlı uygulama süresini yeniden kullanma fırsatı sağlar.

Bir sınıf oluştururken, tamamen yeni veri üyeleri ve üye işlevler yazmak yerine, programcı yeni sınıfın mevcut bir sınıfın üyelerini miras alması gerektiğini belirleyebilir. Bu var olan sınıfa temel sınıf denir ve yeni sınıfa türetilmiş sınıf denir.

Kalıtım fikri, IS-A ilişkisini uygular. Örneğin, memeli bir hayvandır, köpek IS-Bir memelidir, dolayısıyla köpek IS-A hayvandır vb.

Temel Sınıf ve Alt Sınıf

Bir alt sınıf, önceden tanımlanmış bir temel sınıftan türetilir. Bir alt sınıf, kendi üyelerine sahip olmanın yanı sıra temel sınıfın üyelerini de miras alır.

Bir alt sınıf, inherit aşağıda gösterildiği gibi anahtar kelime -

type MyDerived(...) =
   inherit MyBase(...)

F #'da, bir sınıfın en fazla bir doğrudan temel sınıfı olabilir. Kullanarak bir temel sınıf belirtmezsenizinherit anahtar kelime, sınıf dolaylı olarak Object'ten miras alır.

Lütfen aklınızda bulundurun -

  • Temel sınıfın yöntemleri ve üyeleri, türetilmiş sınıfın doğrudan üyeleri gibi türetilmiş sınıfın kullanıcıları tarafından kullanılabilir.

  • Bağlamaların ve yapıcı parametrelerinin bir sınıfa özel olmasına izin verin ve bu nedenle türetilmiş sınıflardan erişilemez.

  • Anahtar kelime basetemel sınıf örneğini ifade eder. Kendini tanımlayıcı gibi kullanılır.

Misal

type Person(name) =
   member x.Name = name
   member x.Greet() = printfn "Hi, I'm %s" x.Name

type Student(name, studentID : int) =
   inherit Person(name)
   let mutable _GPA = 0.0
   member x.StudentID = studentID
   member x.GPA
      with get() = _GPA
      and set value = _GPA <- value

type Teacher(name, expertise : string) =
   inherit Person(name)

   let mutable _salary = 0.0
   member x.Salary
      with get() = _salary
      and set value = _salary <- value
   member x.Expertise = expertise

//using the subclasses
let p = new Person("Mohan")
let st = new Student("Zara", 1234)
let tr = new Teacher("Mariam", "Java")

p.Greet()
st.Greet()
tr.Greet()

Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -

Hi, I'm Mohan
Hi, I'm Zara
Hi, I'm Mariam

Geçersiz Kılma Yöntemleri

Bir temel sınıf yönteminin varsayılan bir davranışını geçersiz kılabilir ve bunu alt sınıfta veya türetilmiş sınıfta farklı şekilde uygulayabilirsiniz.

F #'daki yöntemler varsayılan olarak geçersiz kılınamaz.

Türetilmiş bir sınıftaki yöntemleri geçersiz kılmak için, yönteminizi kullanarak geçersiz kılınabilir olarak bildirmeniz gerekir. abstract ve default aşağıdaki gibi anahtar kelimeler -

type Person(name) =
   member x.Name = name
   abstract Greet : unit -> unit
   default x.Greet() = printfn "Hi, I'm %s" x.Name

Artık, Person sınıfının Greet yöntemi türetilmiş sınıflarda geçersiz kılınabilir. Aşağıdaki örnek bunu göstermektedir -

Misal

type Person(name) =
   member x.Name = name
   abstract Greet : unit -> unit
   default x.Greet() = printfn "Hi, I'm %s" x.Name

type Student(name, studentID : int) =
   inherit Person(name)

   let mutable _GPA = 0.0

   member x.StudentID = studentID
   member x.GPA
      with get() = _GPA
      and set value = _GPA <- value
   override x.Greet() = printfn "Student %s" x.Name

type Teacher(name, expertise : string) =
   inherit Person(name)
   let mutable _salary = 0.0
   member x.Salary
      with get() = _salary
      and set value = _salary <- value

   member x.Expertise = expertise
   override x.Greet() = printfn "Teacher %s." x.Name

//using the subclasses
let p = new Person("Mohan")
let st = new Student("Zara", 1234)
let tr = new Teacher("Mariam", "Java")

//default Greet
p.Greet()

//Overriden Greet
st.Greet()
tr.Greet()

Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -

Hi, I'm Mohan
Student Zara
Teacher Mariam.

Soyut Sınıf

Bazen bir nesnenin, gerçekte uygulanmaması gereken eksik bir uygulamasını sağlamanız gerekir. Daha sonra başka bir programcı, tam bir uygulama için soyut sınıfın alt sınıflarını oluşturmalıdır.

Örneğin, bir Okul Yönetim Sisteminde Kişi sınıfına ihtiyaç duyulmayacaktır. Ancak Öğrenci veya Öğretmen sınıfına ihtiyaç duyulacaktır. Bu gibi durumlarda, Person sınıfını soyut bir sınıf olarak ilan edebilirsiniz.

AbstractClass öznitelik derleyiciye sınıfın bazı soyut üyelere sahip olduğunu söyler.

Soyut bir sınıfın bir örneğini oluşturamazsınız çünkü sınıf tam olarak uygulanmamaktadır.

Aşağıdaki örnek bunu göstermektedir -

Misal

[<AbstractClass>]
type Person(name) =
   member x.Name = name
   abstract Greet : unit -> unit

type Student(name, studentID : int) =
   inherit Person(name)
   let mutable _GPA = 0.0
   member x.StudentID = studentID
   member x.GPA
      with get() = _GPA
      and set value = _GPA <- value
   override x.Greet() = printfn "Student %s" x.Name

type Teacher(name, expertise : string) =
   inherit Person(name)
   let mutable _salary = 0.0
   member x.Salary
      with get() = _salary
      and set value = _salary <- value
   member x.Expertise = expertise
   override x.Greet() = printfn "Teacher %s." x.Name

let st = new Student("Zara", 1234)
let tr = new Teacher("Mariam", "Java")

//Overriden Greet
st.Greet()
tr.Greet()

Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -

Student Zara
Teacher Mariam.