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 veyaPrivate
Friend
sınıfını devralamaz ve sınıfFriend
birPrivate
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ınMustInherit
ö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 birOverridable
ö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 olarakPublic
, yöntemler şeklindedirNotOverridable
.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 ,Function
veyaProperty
deyimindenSub
oluşur. Başka deyimlere izin verilmez ve özellikle orEnd Function
deyimi yokturEnd Sub
.MustOverride
yöntemleri sınıflardaMustInherit
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 PayEmployee
yöntemi geçersiz kılan bir temel sınıfı ve türetilmiş bir sınıfı BonusPayroll
tanımlar. bir yordamı, RunPayroll
her iki nesnenin de yöntemini yürüten PayEmployee
bir nesnesini ve nesnesini bir işleve Pay
oluş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 MyBase
ilgili 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şmekPrivate
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ırmadaIs
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 nitelenenMyBase
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 gibiFriend
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. MyClass
Me
öğ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ırmadaIs
kullanılamaz.MyClass
, içeren sınıfı ve devralınan üyelerini ifade eder.MyClass
üyeler içinShared
niteleyici olarak kullanılabilir.MyClass
birShared
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ı anlamaMyBase.
sahiptir.
Aşağıdaki örnek ve MyClass
değ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 derivedClass
testMethod
bile, 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 testMethod
yapılan çağrıyı çözümler.
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin