Ottieni il riferimento all'oggetto Genitore durante l'istanziazione

1

Ho una situazione in cui una classe personalizzata è una proprietà di un'altra classe.

Quello che devo essere in grado di fare, se è possibile, è ottenere un reverse alla classe "parent" (cioè la classe che detiene la classe corrente come una proprietà).

Per istanza:

Public Class Class1
  ...
  public readonly property Prop11 as Class2
  public property Prop12 as String
  ...
End Class

Public Class Class2
  ...
  private _par as Class1
  private _var21 as string
  ...
  Public Sub New(...)
    me._par = ????
    ...
  End Sub
  public readonly property Prop21 as string
    Get
      return me._par.Prop12 & me._var21
    End Get
  End Property
  ...
End Class

In definitiva, sto provando ad accedere ad altre proprietà entro Class1 da Class2 poiché hanno sostanza per le informazioni da Class2 . Esistono diverse altre classi all'interno di Class1 che forniscono informazioni descrittive ad altre classi contenute al suo interno come proprietà ma le informazioni non sono estendibili a tutte le classi tramite Ereditarietà, poiché Class1 viene utilizzato come contenitore di risorse per le classi di proprietà e l'applicazione stessa.

Diagramma, design pigro;):

Application <- Class1.Prop12
Application <- Class1.Prop11.Prop21

Domanda:

  1. È possibile ottenere una ricorsione attraverso questa impostazione di progettazione?
posta GoldBishop 03.12.2012 - 17:52
fonte

4 risposte

2

Bene, il tuo design ha dei problemi, questo è certo, e hai nascosto il problema un po 'troppo qui.

Quello che posso suggerire, in base a ciò che hai dato, è quello, invece di questo:

class1.Prop12.Prop21

fai questo:

class1.WrappedProp

dove Class1 implementa WrappedProp in questo modo:

Public Class Class1
    ...
    Public readonly property WrappedProp as string
        Get
            return me.Prop12 & myChild.Var21
        End Get
    End Property
    ...
End Class

Ciò significa che la "domanda" (o qualunque oggetto detenga un riferimento alla tua classe 1 / genitore) non dovrebbe accedere alla classe figlia (o, per quanto ne sappia, conoscerla). Da quello che posso dire, quello che stai facendo è fornire una sorta di contenitore o wrapper con la tua classe genitore, ma non avvolgere completamente o contenere il tipo di bambino.

    
risposta data 04.12.2012 - 17:38
fonte
2

Penso che il tuo design non sia ottimale, che qualcosa non va. E i nomi che stai usando non aiutano neanche.

È una specie di analogia forzata ma ... Un orologio ha bisogno di sapere chi lo possiede per fare il suo lavoro? Una penna ha bisogno di sapere chi lo possiede per il suo lavoro? È la stessa cosa qui. Puoi dire che l'orologio ha bisogno di alcune informazioni sul proprietario per fare il suo lavoro, in particolare il tempo per l'allarme.

Ma questo non è il caso qui. Nel tuo codice, Class2 ha bisogno di qualcosa da Class1 per poter esistere. Una delle sue proprietà non può lasciare su di sé senza Class1. Se fosse un metodo, capirò. Ma una proprietà?

In ogni caso, alternative:

  • Se hai bisogno di per conoscere il proprietario, passalo come parametro costruttore.

  • Passa ciò di cui le altre classi hanno bisogno come parametro.

  • Se si tratta di molte informazioni, la classe 1 è probabilmente una composizione di oggetti più piccoli. Spezzala e passa i pezzetti come parametri ad un'altra classe.

  • Utilizza una 3a classe come Helper. Utilizzerà le informazioni delle altre due classi per fare ciò che è necessario.

PS: se puoi modificare e rendere più significativo il nome di classi / proprietà, possiamo aiutarti meglio.

    
risposta data 04.12.2012 - 17:08
fonte
1

Il modo più semplice per farlo è avere Class1.Prop21 per controllare la durata di Class2 , questo gli permetterà di assegnare la relazione Parent .

    
risposta data 03.12.2012 - 23:18
fonte
1

Bene ... ti suggerirei di considerare di ripensare il tuo design, ma certo che puoi avere due oggetti che si richiamano l'un l'altro; è banale.

La vera domanda è come si desidera gestire l'istanziazione / inizializzazione. Uno degli oggetti, il "genitore", come hai deciso di pensarci, contiene il "bambino", oppure viene coinvolto un terzo oggetto per coordinare l'aggregazione di "genitore" e "figlio".

Tuttavia, prima di entrare in questo, un concetto simile che potresti voler controllare è il pattern Visitor, che è usato per cose più grandi di questo, ma in un senso granulare dipende da un oggetto che viene passato ad un altro che poi passa se stesso torna a quell'oggetto.

Esiste anche il modello di "auto delegazione" di Kent Beck; se invece di usare le proprietà per accoppiare insieme i due oggetti hai ristretto la tua logica in uno o più metodi, potresti avere il "genitore" passare se stesso nei metodi di "figlio" come parametro se necessario, evitando così di tornare indietro -accoppiamento dal "figlio" al "genitore".

Andando un po 'più in là, a seconda di cosa questa configurazione "genitore" e "figlio" è destinata a modellare, si potrebbe semplicemente considerare un'implementazione Composite.

    
risposta data 04.12.2012 - 18:20
fonte

Leggi altre domande sui tag