Ricerca…


Definire una classe

Le lezioni sono aspetti vitali dell'OOP. Una classe è come il "progetto" di un oggetto. Un oggetto ha le proprietà di una classe, ma le caratteristiche non sono definite all'interno della classe stessa. Poiché ogni oggetto può essere diverso, definiscono le loro caratteristiche.

Public Class Person
End Class
 
Public Class Customer
End Class

Una classe può anche contenere sottoclassi . Una sottoclasse eredita le stesse proprietà e comportamenti della sua classe genitore, ma può avere le sue proprietà e classi uniche.

Modificatori dell'ereditarietà (sulle classi)

eredita

Specifica la classe base (o genitore)

Public Class Person
End Class

Public Class Customer
    Inherits Person

End Class

'One line notation
Public Class Student : Inherits Person
End Class

Oggetti possibili:

Dim p As New Person
Dim c As New Customer
Dim s As New Student

NotInheritable

Impedisce ai programmatori di utilizzare la classe come classe base.

Public NotInheritable Class Person
End Class

Oggetti possibili:

Dim p As New Person

MustInherit

Specifica che la classe è concepita per essere utilizzata solo come classe base. (Classe astratta)

Public MustInherit Class Person
End Class

Public Class Customer
    Inherits Person
End Class

Oggetti possibili:

Dim c As New Customer

Modificatori di ereditarietà (su proprietà e metodi)

Overridable

Permette di sovrascrivere una proprietà o un metodo in una classe in una classe derivata.

Public Class Person
    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub
End Class

Sostituzioni

Sovrascrive una proprietà o un metodo Overridable definito nella classe base.

Public Class Customer
    Inherits Person

    'Base Class must be Overridable
    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub
End Class

NotOverridable

Impedisce che una proprietà o un metodo vengano sovrascritti in una classe ereditaria. Comportamento predefinito Può essere dichiarato solo sui metodi di sostituzione

Public Class Person

    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub

End Class

Public Class Customer
    Inherits Person

    Public NotOverridable Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

Public Class DetailedCustomer
    Inherits Customer

    'DoSomething can't be overridden
End Class

Esempio di utilizzo:

Dim p As New Person
p.DoSomething()

Dim c As New Customer
c.DoSomething()

Dim d As New DetailedCustomer
d.DoSomething()

Produzione:

Person
Customer
Customer

MustOverride

Richiede che una classe derivata sostituisca la proprietà o il metodo.

I metodi MustOverride devono essere dichiarati nelle classi MustInherit.

Public MustInherit Class Person

    Public MustOverride Sub DoSomething()
    'No method definition here

End Class

Public Class Customer
    Inherits Person

    'DoSomething must be overridden
    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

Esempio di utilizzo:

Dim c As New Customer
c.DoSomething()

Produzione:

Customer

MyBase

La parola chiave MyBase si comporta come una variabile oggetto che fa riferimento alla classe base dell'istanza corrente di una classe.

Public Class Person
    Public Sub DoSomething()
        Console.WriteLine("Person")
    End Sub
End Class

Public Class Customer
    Inherits Person

    Public Sub DoSomethingElse()
        MyBase.DoSomething()
    End Sub

End Class

Esempio di utilizzo:

Dim p As New Person
p.DoSomething()

Console.WriteLine("----")

Dim c As New Customer
c.DoSomething()
c.DoSomethingElse()

Produzione:

Person
----
Person
Person

Me vs MyClass

Io usa l'istanza dell'oggetto corrente.

MyClass utilizza memberdefinition nella classe in cui viene chiamato il membro

Class Person
    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub

    Public Sub useMe()
        Me.DoSomething()
    End Sub

    Public Sub useMyClass()
        MyClass.DoSomething()
    End Sub
End Class

Class Customer
    Inherits Person

    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub
End Class

Esempio di utilizzo:

Dim c As New Customer
c.useMe()
c.useMyClass()

Produzione:

Customer
Person

Sovraccarico

Il sovraccarico è la creazione di più di una procedura, costruttore di istanze o proprietà in una classe con lo stesso nome ma tipi di argomenti diversi.

Class Person
    Overloads Sub Display(ByVal theChar As Char)
        ' Add code that displays Char data.
    End Sub

    Overloads Sub Display(ByVal theInteger As Integer)
        ' Add code that displays Integer data.
    End Sub

    Overloads Sub Display(ByVal theDouble As Double)
        ' Add code that displays Double data.
    End Sub
End Class

Shadows

Ricalcola un membro che non è sovrascrivibile. Saranno interessate solo le chiamate all'istanza. Il codice all'interno delle classi base non sarà influenzato da questo.

Public Class Person
    Public Sub DoSomething()
        Console.WriteLine("Person")
    End Sub


    Public Sub UseMe()
        Me.DoSomething()
    End Sub
End Class
Public Class Customer
    Inherits Person
    Public Shadows Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

Esempio di utilizzo:

Dim p As New Person
Dim c As New Customer
p.UseMe()
c.UseMe()
Console.WriteLine("----")
p.DoSomething()
c.DoSomething()

Produzione:

Person
Person
----
Person
Customer

Insidie :

Esempio 1, Creazione di un nuovo oggetto tramite un generico. Quale funzione verrà utilizzata ??

Public Sub CreateAndDoSomething(Of T As {Person, New})()
    Dim obj As New T
    obj.DoSomething()
End Sub

esempio di utilizzo:

Dim p As New Person
p.DoSomething()
Dim s As New Student
s.DoSomething()
Console.WriteLine("----")
CreateAndDoSomething(Of Person)()
CreateAndDoSomething(Of Student)()

Uscita: per intuizione il risultato dovrebbe essere lo stesso. Eppure non è vero.

Person
Student
----
Person
Person

Esempio 2:

Dim p As Person
Dim s As New Student
p = s
p.DoSomething()
s.DoSomething()

Output: per intuizione si potrebbe pensare che p e s siano uguali e si comportino in modo uguale. Eppure non è vero.

Person
Student

In questi semplici esempi è facile imparare lo strano comportamento di Shadows. Ma nella vita reale porta molte sorprese. È consigliabile evitare l'uso di ombre. Uno dovrebbe usare altre alternative il più possibile (overrides ecc.)

interfacce

Public Interface IPerson
    Sub DoSomething()
End Interface

Public Class Customer
    Implements IPerson
    Public Sub DoSomething() Implements IPerson.DoSomething
        Console.WriteLine("Customer")
    End Sub

End Class


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow