28 messaggi dal 23 novembre 2004
Ciao a tutti,

ho bisogno di alcuni chiarimenti in merito alle classi. In particolare vorrei risucire a capire la differenza tra questi due pezzi di codice:

Public Sub New(id As Integer, name As String, description As String, managerId As Integer, creatorUsername As String)
MyClass.New(id, name, description, managerId, String.Empty, creatorUsername, String.Empty, DefaultValues.GetDateTimeMinValue())
End Sub 'New

e

Public Sub New(id As Integer, name As String, description As String, managerId As Integer, managerDisplayName As String, creatorUsername As String, creatorDisplayName As String, dateCreated As DateTime)
' Validate Mandatory Fields//
If name Is Nothing OrElse name.Length = 0 Then
Throw New ArgumentOutOfRangeException("name")
End If
_Id = id
_Description = description
_Name = name
_ManagerId = managerId
_ManagerDisplayName = managerDisplayName
_CreatorUserName = creatorUsername
_CreatorDisplayName = creatorDisplayName
_DateCreated = dateCreated
End Sub 'New

Grazie a tutti.

C
Si tratta in entrambi i casi di un costruttore. Il secondo metodo esegue del codice e inizializza i campi privati. Come puoi vedere, le firme dei due metodi sono diverse (anche se il nome del metodo è lo stesso, il numero di parametri varia nei due casi). Quindi il costruttore risulta sovraccaricato (overload) e presenta due firme distinte.

Ciao, Ricky.
Modificato da rickyvr il 24 novembre 2004 11.54 -

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
MyClass.New serve per la concatenazione dei costruttori in VB.NET. Il primo costruttore richiama il secondo costruttore, all'interno del quale sta il codice.

Ciao, Ricky.
Modificato da rickyvr il 24 novembre 2004 12.07 -

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
28 messaggi dal 23 novembre 2004
Ciao Ricky,

grazie per la risposta. Vorrei però qualche ulteriore chiarimento.
Il codice che ho postato è stato preso da un'applicazione scritta da Microsoft sul sito ASP.NET (Starter Kit) che sto tuilizzando come base per la mia applicazione.
Ho notato che nella classe l'indicazione del costruttore New viene utilizzata tutte le volte che nel codice ASP.NET creo una nuova istanza dell'oggetto (con parametri diversi se ben capisco). Allora qual'è il significato della prima dichiarazione visto che non inizializza campi provati?

Ciao

C
Serve per la concatenazione, ovvero per richiamare un altro costruttore e per evitare di replicare le sezioni di codice uguale nei diversi costruttori.

Io utilizzo di solito C# e la sintassi di concatenazione è diversa, ma il concetto simile.

Guarda questo post:
http://blogs.aspitalia.com/rickyvr/post591.aspx

Se la cosa non ti è chiara dopo aver letto, ne riparliamo su questi schermi!!!

Ciao, Ricky.

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
28 messaggi dal 23 novembre 2004
Ho letto il link e credo di riuscire ad afferrare il significato. Ma per essere un po più pratici:

Ho una classe chiamata progetto.
Da quello che ho capito ogni volta che creo un nuovo oggetto di quella classe devo fornire i parametri necessari.
Ad esempio nel caso della classe progetto ho bisogno del Responsabile e della Data di Partenza.
Se, come spesso capita, in altre parti del codice ho bisogno di creare un nuovo oggetto di questo tipo e voglio fornirgli anche il parametro Data di Fine devo creare un nuovo costrutto New.
Con l'esempio che mi hai fatto leggere è possibile concatenere i costruttori new senza doverne scrivere diversi?
Perchè però nel caso dell'uso della parola myclass.new non vengono valorizzati i campi privati?

Scusa la mia confusione ma sono all'inizio (ero rimasto al vecchio VB).

CL
Perchè lo fa il secondo costruttore che richiami tramite MyClass.New.

Prova a fare debugging ed eseguire linea per linea il codice. Vedrai che quando lanci il primo costruttore, in realtà viene eseguito anche il secondo costruttore con i parametri indicati nel primo costruttore.

Non ti serve inizializzare i campi privati nel primo costruttore, perchè questo viene fatto nel secondo.

L'inizializzazione dei campi privati rappresenta di fatto la parte di codice comune che tramite la concatezione è possibile evitare di replicare nell'implementazione dei vari costruttori.

Ciao, Ricky.

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
28 messaggi dal 23 novembre 2004
OK. Adesso mi è un po più chiaro. Quindi, riassumendo, se mi trovo di fronte al caso descritto prima posso:

Creare un primo costruttore ( MyClass.New) nel quale elenco solo i parametri (ad esempio Responsabile, DataPartenza).

Creare un secondo Costruttore ( MyClass.New) nel quale elenco altri parametri (ad esempio Responsabile e DatadiFine)

Creare un terzo costruttore con tutti i parametri prima elencati e eseguire la loro assegnazione ai campi privati.

Giusto?

Non è importante l'ordine? Come si regola quando eseguo la chiamata nel codice in questi casi?

Public Sub New(id As Integer, name As String, description As String, managerId As Integer, creatorUsername As String)
MyClass.New(id, name, description, managerId, String.Empty, creatorUsername, String.Empty, DefaultValues.GetDateTimeMinValue())
End Sub 'New

Public Sub New(id As Integer, name As String, description As String, managerDisplayName As String, creatorDisplayName As String, dateCreated As DateTime)
MyClass.New(id, name, description, DefaultValues.GetUserIdMinValue(), managerDisplayName, String.Empty, creatorDisplayName, dateCreated)
End Sub 'New

Public Sub New(id As Integer, name As String, description As String, managerId As Integer, managerDisplayName As String, creatorUsername As String, creatorDisplayName As String, dateCreated As DateTime)
' Validate Mandatory Fields//
If name Is Nothing OrElse name.Length = 0 Then
Throw New ArgumentOutOfRangeException("name")
End If
_Id = id
_Description = description
_Name = name
_ManagerId = managerId
_ManagerDisplayName = managerDisplayName
_CreatorUserName = creatorUsername
_CreatorDisplayName = creatorDisplayName
_DateCreated = dateCreated
End Sub 'New

E, infine, che significato hanno quelle string.empty?

Grazie ancora per la pazienza.

CL

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.