Aracılığıyla paylaş


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 fazla kalıtıma izin verilmese de, sınıflar birden çok arayüz uygulayarak aynı amaçlara etkili bir şekilde ulaşabilir.

  • 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 FriendPrivate 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 , Subveya Function deyiminden Propertyoluşur. Başka deyimlere izin verilmez ve özellikle End Sub veya End Function deyimi yoktur. MustOverride yöntemleri MustInherit sınıflarında bildirilmelidir.

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

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

Aşağıdaki örnek, Payrolldevralınan bir yöntemi BonusPayrollgeçersiz kılan bir temel sınıfı , ve türetilmiş bir sınıfı PayEmployeetanımlar. Bir prosedür RunPayroll, Payroll nesnesi ve BonusPayroll nesnesi oluşturur ve bunları her iki nesnenin de PayEmployee yöntemini yürüten bir işleme, Pay, geçirir.

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 yapıcısından açıkça bir temel sınıf yapıcısını ç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. Private sınıfındaki üyelere erişmek 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.

  • MyBase'ü, MustOverride temel sınıf metotlarını çağırmak için kullanamazsınız.

  • 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 farklı bir derlemede bulunan temel sınıf üyeleri Friend işaretlenmişse erişim için kullanılamaz."

Daha fazla bilgi ve başka bir örnek için Türetilmiş Bir Sınıf Tarafından Gizlenmiş Bir Değişkene Nasıl Erişilir bölümüne bakın.

MyClass Anahtar Sözcüğü

MyClass anahtar sözcüğü, başlangıçta uygulanmış haliyle bir sınıfın geçerli örneğine başvuran bir nesne değişkeni gibi davranır. MyClass Me öğesine benzer, ancak MyClass üzerindeki her yöntem ve özellik çağrısı, yöntem veya özellik NotOverridable olarak 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 türeyen üyeleri 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 Me ve MyClass karşılaştırır.

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

derivedClass testMethod'i geçersiz kılmış olsa bile, useMyClass içindeki MyClass anahtar sözcüğü, geçersiz kılmanın etkilerini iptal eder ve derleyici çağrıyı temel sınıfın testMethod sürümüne yönlendirir.

Ayrıca bkz.