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
PublicbirFriendveyaPrivatesınıfını alamaz ve bir sınıf birFriendPrivatesı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:
Inheritsifade — temel sınıfı belirtir.NotInheritabledeğiştirici — programcıların sınıfı temel sınıf olarak kullanmasını engeller.MustInheritdeğiştirici — sınıfın yalnızca temel sınıf olarak kullanılması amaçlandığını belirtir. Sınıfların örnekleriMustInheritdoğ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.Overrides—OverridableTemel 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 olarakPublicYöntemlerNotOverridable.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ızcaSub,Function, veyaPropertydeyiminden oluşur. Başka hiçbir ifadeye izin verilmez ve özellikle birEnd SubveyaEnd Functiondeyimi yoktur.MustOverrideYöntemlerMustInheritsı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 :
MyBaseen hızlı temel sınıfa ve devralınan üyelerine başvurur. Sınıftaki üyelere erişmek için kullanılamazPrivate.MyBase, gerçek bir nesne değil, bir anahtar sözcüktür.MyBasebir değişkene atanamaz, yordamlara geçirilemez veya birIskarşı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şvurununMyBasedoğ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.MyBaseMustOverrideTemel sınıf yöntemlerini çağırmak için kullanamazsınız.MyBasekendisini nitelemek için kullanılamaz. Bu nedenle, aşağıdaki kod geçerli değildir:MyBase.MyBase.BtnOK_Click()MyBasemodü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.MyClassbir değişkene atanamaz, yordamlara geçirilemez veya birIskarşılaştırmada kullanılamaz.MyClassiçerilen sınıfa ve devralınan üyelerine başvurur.MyClass, Üyeler için bir niteleyici olarak kullanılabilirShared.MyClassbir yöntem içinde kullanılamazShared, ancak bir sınıfın paylaşılan üyesine erişmek için bir örnek yöntemi içinde kullanılabilir.MyClassstandart 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 sahiptirMyBase..
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 .