Devralma Temelleri (Visual Basic)

İfade, bir Inherits temel sınıf olarak bilinen varolan bir sınıfa göre 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 devralınır ve temel sınıfta tanımlanan özellikleri, yöntemleri, olayları, alanları ve sabitleri genişletebilir. Aşağıdaki bölümde, devralma için bazı kurallar ve sınıfların devralınması veya Devralındığı şekilde değiştirmek için kullanabileceğiniz değiştiriciler açıklanmaktadır:

  • Varsayılan olarak, anahtar sözcüğüyle işaretlenmedikçe tüm sınıflar devralınabilir NotInheritable . Sınıflar, projenizdeki diğer sınıflardan veya projenizin başvurduğu diğer derlemelerin sınıflarından devralınabilir.

  • birden çok devralmaya izin veren dillerden farklı olarak Visual Basic sınıflarda yalnızca tekli devralmaya izin verir; diğer bir deyişle, türetilmiş sınıfların yalnızca bir taban sınıfı olabilir. Sınıflarda birden çok devralmaya izin verilmese de sınıflar, aynı uçları etkin bir şekilde gerçekleştirebilen birden çok arabirim uygulayabilir.

  • Bir temel sınıfta kısıtlı öğelerin sunulmasını engellemek için, türetilmiş bir sınıfın erişim türü, taban sınıfına eşit veya daha kısıtlayıcı olmalıdır. Örneğin, bir sınıf Public bir Friend veya Private sınıfını alamaz ve bir sınıf bir Friend Private sınıfı devralınabilir.

Devralma değiştiricileri

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

  • Inherits ifade — temel sınıfı belirtir.

  • NotInheritable değiştirici — programcıların sınıfı temel sınıf olarak kullanmasını engeller.

  • MustInherit değiştirici — sınıfın yalnızca temel sınıf olarak kullanılması amaçlandığını belirtir. Sınıfların örnekleri MustInherit doğrudan oluşturulamaz; yalnızca türetilmiş bir sınıfın temel sınıf örnekleri olarak oluşturulabilirler. (C++ ve C# gibi diğer programlama dilleri, bu tür bir sınıfı anlatmak 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 özelliğin veya yöntemin türetilmiş sınıfta farklı davranması gerekiyorsa, geçersiz kılınabilir. Diğer bir deyişle, türetilmiş sınıfta yönteminin yeni bir uygulamasını tanımlayabilirsiniz. Özelliklerin ve yöntemlerin nasıl geçersiz kılınabileceğini denetlemek için aşağıdaki değiştiriciler kullanılır:

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

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

  • NotOverridable — Bir özelliğin veya yöntemin devralan bir sınıfta geçersiz kılınmasını önler. Varsayılan olarak Public Yöntemler NotOverridable .

  • MustOverride — Türetilmiş bir sınıfın özelliği veya yöntemi geçersiz kılmasını gerektirir. MustOverrideAnahtar sözcüğü kullanıldığında, yöntem tanımı yalnızca Sub , Function , veya Property deyiminden oluşur. Başka hiçbir ifadeye izin verilmez ve özellikle bir End Sub veya End Function deyimi yoktur. MustOverride Yöntemler MustInherit sınıflarda bildirilmelidir.

Bordroları işlemek için sınıflar tanımlamak istediğinizi varsayalım. Payroll RunPayroll Tipik bir hafta için bordroları hesaplayan bir yöntemi içeren genel bir sınıf tanımlayabilirsiniz. PayrollDaha sonra BonusPayroll , çalışan primi dağıtılırken kullanılabilecek daha özelleştirilmiş bir sınıf için temel sınıf olarak kullanabilirsiniz.

BonusPayrollSınıfı, PayEmployee temel sınıfta tanımlanan yöntemi alabilir ve geçersiz kılabilir Payroll .

Aşağıdaki örnek, bir temel sınıfı Payroll, ve devralınmış bir yöntemi geçersiz kılan türetilmiş bir sınıfı tanımlar BonusPayroll PayEmployee . Bir yordam,, her iki nesnenin yöntemini çalıştıran bir RunPayroll işleve bir nesne ve bir nesnesi oluşturur ve geçirir Payroll BonusPayroll Pay PayEmployee .

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üğü

MyBaseAnahtar sözcüğü, sınıfın geçerli örneğinin temel sınıfına başvuran bir nesne değişkeni gibi davranır. MyBase , türetilmiş bir sınıfta geçersiz kılınan veya gölgeli temel sınıf üyelerine erişmek için sık kullanılır. Özellikle, MyBase.New türetilmiş bir sınıf oluşturucusundan bir temel sınıf oluşturucusunu açıkça ç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 tasarlamakta olduğunuzu varsayalım. Geçersiz kılınan yöntem, temel sınıfta yöntemi çağırabilir ve döndürülen değeri aşağıdaki kod parçasında gösterildiği gibi 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, kullanma kısıtlamaları açıklanmaktadır MyBase :

  • MyBase en hızlı temel sınıfa ve devralınan üyelerine başvurur. Sınıftaki üyelere erişmek için kullanılamaz Private .

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

  • MyBaseNiteleyen yöntemin, anlık temel sınıfta tanımlanması gerekmez; bunun yerine dolaylı olarak devralınan bir temel sınıfta tanımlanabilir. Bir başvurunun MyBase doğru bir şekilde derlenmesi için, bazı temel sınıflar, çağrıda görünen ad ve parametre türleriyle eşleşen bir yöntem içermelidir.

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

  • MyBase kendisini nitelemek için kullanılamaz. Bu nedenle, aşağıdaki kod geçerli değildir:

    MyBase.MyBase.BtnOK_Click()

  • MyBase modüllerde kullanılamaz.

  • MyBase``Friendtemel sınıf farklı bir derlemede yer alıyorsa olarak işaretlenen temel sınıf üyelerine erişmek için kullanılamaz.

Daha fazla bilgi ve diğer bir örnek için bkz. nasıl yapılır: türetilmiş bir sınıf tarafından gizlenen bir değişkene erişme.

MyClass anahtar sözcüğü

MyClassAnahtar sözcüğü, başlangıçta uygulanmış olan bir sınıfın geçerli örneğine başvuran bir nesne değişkeni gibi davranır. MyClass benzerdir Me , ancak her yöntem ve özellik çağrısı, MyClass Yöntem veya özellik NotOverridablegibi değerlendirilir. Bu nedenle, yöntem veya özellik türetilmiş bir sınıfta geçersiz kılınmadan etkilenmez.

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

  • MyClass içerilen sınıfa ve devralınan üyelerine başvurur.

  • MyClass , Üyeler için bir niteleyici olarak kullanılabilir Shared .

  • MyClass bir yöntem içinde kullanılamaz Shared , 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ğlanmış yöntemin uygulanması olmayan bir yöntemi nitelemek için kullanılabilir. Bu tür bir başvuru, yöntemiyle aynı anlama sahiptir MyBase. .

Aşağıdaki örnek Me ve ile karşılaştırılır MyClass .

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

derivedClassGeçersiz kılmalar olsa da testMethod , MyClass içindeki anahtar sözcüğü useMyClass geçersiz kılma etkilerini artırır ve derleyici, öğesinin temel sınıf sürümü çağrısını çözer testMethod .

Ayrıca bkz.