Devralma Temelleri (Visual Basic)

deyimiInherits, temel sınıf olarak bilinen mevcut bir sınıfı temel alarak türetilmiş sınıf olarak adlandırılan yeni bir sınıf bildirmek için kullanılır. Türetilmiş sınıflar temel sınıfta tanımlanan özellikleri, yöntemleri, olayları, alanları ve sabitleri devralır ve genişletebilir. Aşağıdaki bölümde devralma kurallarından bazıları ve sınıfların devralma veya devralma şeklini değiştirmek için kullanabileceğiniz değiştiriciler açıklanmaktadır:

  • Varsayılan olarak, anahtar sözcükle işaretlenmediği sürece tüm sınıflar devralınabilir NotInheritable . Sınıflar, projenizdeki diğer sınıflardan veya projenizin başvurduğunu diğer derlemelerdeki sınıflardan devralabilir.

  • Birden çok devralma izin dillerinden farklı olarak, Visual Basic sınıflarda yalnızca tek devralma izin verir; başka bir ifadeyle, türetilmiş sınıfların yalnızca bir temel sınıfı olabilir. Sınıflarda birden çok devralmaya izin verilmiyor olsa da, sınıflar aynı uçları etkili bir şekilde tamamlayan birden çok arabirim uygulayabilir.

  • Bir temel sınıfta kısıtlanmış öğelerin açığa çıkmasını önlemek için, türetilmiş bir sınıfın erişim türü temel sınıfına eşit veya daha kısıtlayıcı olmalıdır. Örneğin, bir Public sınıf veya PrivateFriend sınıfını devralamaz ve sınıf Friend bir Private sınıfı devralamaz.

Devralma Değiştiricileri

Visual Basic devralmayı desteklemek için aşağıdaki sınıf düzeyinde deyimleri ve değiştiricileri tanıtır:

  • Inherits deyimi — Temel sınıfı belirtir.

  • NotInheritable modifier — Programcıların sınıfı temel sınıf olarak kullanmasını engeller.

  • MustInherit modifier — Sınıfın yalnızca temel sınıf olarak kullanılmak üzere tasarlandığını belirtir. Sınıfların MustInherit örnekleri doğrudan oluşturulamaz; bunlar yalnızca türetilmiş bir sınıfın temel sınıf örnekleri olarak oluşturulabilir. (C++ ve C# gibi diğer programlama dilleri, böyle bir sınıfı tanımlamak için soyut sınıf terimini kullanır.)

Türetilmiş Sınıflarda Özellikleri ve Yöntemleri Geçersiz Kılma

Varsayılan olarak, türetilmiş bir sınıf temel sınıfından özellikleri ve yöntemleri devralır. Devralınan bir özellik veya yöntemin türetilmiş sınıfta farklı davranması gerekiyorsa geçersiz kılınabilir. Diğer bir ifadeyle, türetilmiş sınıfta yönteminin yeni bir uygulamasını tanımlayabilirsiniz. Özelliklerin ve yöntemlerin nasıl geçersiz kılınmasını denetlemek için aşağıdaki değiştiriciler kullanılır:

  • Overridable — Bir sınıftaki bir özelliğin veya yöntemin türetilmiş bir sınıfta geçersiz kılınmasına izin verir.

  • Overrides — Temel sınıfta tanımlanan bir Overridable özelliği veya yöntemi geçersiz kılar.

  • NotOverridable — Devralan bir sınıfta bir özelliğin veya yöntemin geçersiz kılınmasını engeller. Varsayılan olarak Public , yöntemler şeklindedir NotOverridable.

  • MustOverride — Türetilmiş bir sınıfın özelliği veya yöntemini geçersiz kılmasını gerektirir. MustOverride anahtar sözcüğü kullanıldığında, yöntem tanımı yalnızca , Functionveya Property deyiminden Suboluşur. Başka deyimlere izin verilmez ve özellikle or End Function deyimi yokturEnd Sub. MustOverride yöntemleri sınıflarda MustInherit bildirilmelidir.

Bordro işleyecek sınıflar tanımlamak istediğinizi varsayalım. Tipik bir hafta için bordro hesaplayan bir RunPayroll yöntem içeren genel Payroll bir sınıf tanımlayabilirsiniz. Daha sonra, çalışan bonusları dağıtırken kullanılabilecek daha özel BonusPayroll bir sınıf için temel sınıf olarak kullanabilirsinizPayroll.

BonusPayroll sınıfı, temel Payroll sınıfta tanımlanan yöntemi devralabilir ve geçersiz kılabilirPayEmployee.

Aşağıdaki örnek, Payroll, devralınan PayEmployeeyöntemi geçersiz kılan bir temel sınıfı ve türetilmiş bir sınıfı BonusPayrolltanımlar. bir yordamı, RunPayrollher iki nesnenin de yöntemini yürüten PayEmployee bir nesnesini ve nesnesini bir işleve Payoluşturur ve BonusPayroll geçirirPayroll.

Const BonusRate As Decimal = 1.45D
Const PayRate As Decimal = 14.75D

Class Payroll
    Overridable Function PayEmployee(
        ByVal HoursWorked As Decimal,
        ByVal PayRate As Decimal) As Decimal

        PayEmployee = HoursWorked * PayRate
    End Function
End Class

Class BonusPayroll
    Inherits Payroll
    Overrides Function PayEmployee(
        ByVal HoursWorked As Decimal,
        ByVal PayRate As Decimal) As Decimal

        ' The following code calls the original method in the base 
        ' class, and then modifies the returned value.
        PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) * BonusRate
    End Function
End Class

Sub RunPayroll()
    Dim PayrollItem As Payroll = New Payroll
    Dim BonusPayrollItem As New BonusPayroll
    Dim HoursWorked As Decimal = 40

    MsgBox("Normal pay is: " &
        PayrollItem.PayEmployee(HoursWorked, PayRate))
    MsgBox("Pay with bonus is: " &
        BonusPayrollItem.PayEmployee(HoursWorked, PayRate))
End Sub

MyBase Anahtar Sözcüğü

MyBase anahtar sözcüğü, bir sınıfın geçerli örneğinin temel sınıfına başvuran bir nesne değişkeni gibi davranır. MyBase genellikle türetilmiş bir sınıfta geçersiz kılınan veya gölgelenen temel sınıf üyelerine erişmek için kullanılır. Özellikle, MyBase.New türetilmiş bir sınıf oluşturucusundan açıkça bir temel sınıf oluşturucu çağırmak için kullanılır.

Örneğin, temel sınıftan devralınan bir yöntemi geçersiz kılan türetilmiş bir sınıf tasarladığını varsayalım. Geçersiz kılınan yöntem, temel sınıfta yöntemini çağırabilir ve aşağıdaki kod parçasında gösterildiği gibi dönüş değerini değiştirebilir:

Class DerivedClass
    Inherits BaseClass
    Public Overrides Function CalculateShipping(
        ByVal Dist As Double,
        ByVal Rate As Double) As Double

        ' Call the method in the base class and modify the return value.
        Return MyBase.CalculateShipping(Dist, Rate) * 2
    End Function
End Class

Aşağıdaki listede, kullanımıyla MyBaseilgili kısıtlamalar açıklanmaktadır:

  • MyBase , anlık temel sınıfı ve devralınan üyelerini ifade eder. Sınıfındaki üyelere erişmek Private için kullanılamaz.

  • MyBase bir anahtar sözcüktür, gerçek bir nesne değildir. MyBase bir değişkene atanamaz, yordamlara geçirilemez veya karşılaştırmada Is kullanılamaz.

  • Niteleyen yöntemin MyBase hemen temel sınıfta tanımlanması gerekmez; bunun yerine dolaylı olarak devralınan bir temel sınıfta tanımlanabilir. tarafından nitelenen MyBase bir başvurunun doğru derlenmesi için, bazı temel sınıfın çağrıda görünen parametre adı ve türleriyle eşleşen bir yöntem içermesi gerekir.

  • Temel sınıf yöntemlerini çağırmak MustOverride için kullanamazsınızMyBase.

  • MyBase kendisini niteleme amacıyla kullanılamaz. Bu nedenle, aşağıdaki kod geçerli değildir:

    MyBase.MyBase.BtnOK_Click()

  • MyBase modüllerde kullanılamaz.

  • MyBase temel sınıf farklı bir derlemede gibi Friend işaretlenmiş temel sınıf üyelerine erişmek için kullanılamaz.

Daha fazla bilgi ve başka bir örnek için bkz . How to: Access a Variable Hidden by a Derived Class.

MyClass Anahtar Sözcüğü

anahtar sözcüğü, MyClass başlangıçta uygulandığı gibi bir sınıfın geçerli örneğine başvuran bir nesne değişkeni gibi davranır. MyClassMeöğesine benzer, ancak üzerindeki MyClass her yöntem ve özellik çağrısı, yöntem veya özellik NotOverridable gibi değerlendirilir. Bu nedenle, yöntem veya özellik türetilmiş bir sınıfta geçersiz kılma tarafından etkilenmez.

  • MyClass bir anahtar sözcüktür, gerçek bir nesne değildir. MyClass bir değişkene atanamaz, yordamlara geçirilemez veya karşılaştırmada Is kullanılamaz.

  • MyClass , içeren sınıfı ve devralınan üyelerini ifade eder.

  • MyClass üyeler için Shared niteleyici olarak kullanılabilir.

  • MyClass bir Shared yöntemin içinde kullanılamaz, ancak bir sınıfın paylaşılan üyesine erişmek için bir örnek yöntemi içinde kullanılabilir.

  • MyClass standart modüllerde kullanılamaz.

  • MyClass bir temel sınıfta tanımlanan ve bu sınıfta sağlanan yöntemin uygulaması olmayan bir yöntemi nitelemek için kullanılabilir. Böyle bir başvuru Method ile aynı anlama MyBase.sahiptir.

Aşağıdaki örnek ve MyClassdeğerlerini karşılaştırırMe.

Class baseClass
    Public Overridable Sub testMethod()
        MsgBox("Base class string")
    End Sub
    Public Sub useMe()
        ' The following call uses the calling class's method, even if
        ' that method is an override.
        Me.testMethod()
    End Sub
    Public Sub useMyClass()
        ' The following call uses this instance's method and not any
        ' override.
        MyClass.testMethod()
    End Sub
End Class
Class derivedClass : Inherits baseClass
    Public Overrides Sub testMethod()
        MsgBox("Derived class string")
    End Sub
End Class
Class testClasses
    Sub startHere()
        Dim testObj As derivedClass = New derivedClass()
        ' The following call displays "Derived class string".
        testObj.useMe()
        ' The following call displays "Base class string".
        testObj.useMyClass()
    End Sub
End Class

geçersiz kılsa derivedClasstestMethodbile, MyClass içindeki useMyClass anahtar sözcüğü geçersiz kılmanın etkilerini geçersiz kılar ve derleyici temel sınıf sürümüne testMethodyapılan çağrıyı çözümler.

Ayrıca bkz.