Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446

    [C#]Utilizzo di un metodo di una classe contenuta in una libreria

    Nel mio nuovo progetto ho istanziato la mia classe TemporalLineControl in modo da poter utilizzarne i metodi.
    codice:
    TemporalLine.TemporalLineControl nt = new TemporalLineControl()
    ora vorrei utilizzare un metodo di quella classe OnDragDrop che ho definito in questo modo

    codice:
    protected override void OnDragDrop(DragEventArgs e)
    		{.....}
    Ma se richiamo i metodi e le proprità della mia classe non compare. Forse perchè l'ho dichiarato come protected??
    Se io vado a mettere public nel mio metodo originale mi compare questo errore:

    cannot change access modifiers when overriding 'protected' inherited member 'System.Windows.Forms.Control.OnDragDrop(System.Wi ndows.Forms.DragEventArgs)'

    Come devo fare per usare questo metodo???

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446
    Il problema mi sembra sia: non si può mettere pubblico un metodo che è l'override di uno che è protected.
    Ma allora come posso fare a usare il mio OnDragDrop?

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Se non ricordo male, non è possibile modificare la visibilità di un metodo facendo l'override.

    In Delphi.NET è possibile, per consentire il "porting" del codice esistente e, in secondo luogo, perché l'operazione è supportata, ma viene segnalato un warning in quanto non è "CLS compatibile" (altri linguaggi potrebbero non essere in grado di utilizzare la classe o il metodo):

    [Pascal Hint] Unit2.pas(15): H2384 CLS: overriding virtual method 'ClassB.Dummy' visibility (public) must match base class 'ClassA' (protected)

    Credo che l'unica soluzione sia quella di reintrodurre il metodo con new, ma rinunciando al "comportamento polimorfico".

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446
    penso anch'io sia l'unica soluzione.
    Ma mettendo new nel mio metodo OnDragDrop all'interno della libreria non mi funziona più il DragDrop.
    come mai??

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446
    Perchè se prendo il progetto vecchio da cui poi ho ricavato la mia libreria, se metto new non riesco più a fare il drag&drop; non mi entra più nel corpo della funzione.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da 83kiara83
    Perchè se prendo il progetto vecchio da cui poi ho ricavato la mia libreria, se metto new non riesco più a fare il drag&drop; non mi entra più nel corpo della funzione.
    Te l'ho detto: si perde la proprietà "polimorfica" della classe, cioè non è possibile risalire attraverso un riferimento che appartiene al tipo della classe base da cui deriva la tua classe a quell'implementazione specifica del metodo in quanto l'uso di new introduce, di fatto, un nuovo metodo che ha solamente la caratteristica di avere un nome identico a quello ereditato dalla classe base, ma non è invocabile se non utilizzando direttamente un riferimento che appartenga al tipo specifico della classe che hai creato.

    La soluzione da adottare è, semplicemente, evitare la condizione di dover aumentare la visibilità del metodo: nulla ti vieta, nella classe base, di introdurre un metodo virtuale che viene richiamato dal metodo OnDragDrop, ma che sia public oltreché virtual.

    Nella classe discendente, potrai fare tranquillamente l'override del metodo che hai introdotto tu e che viene chiamato dalla classe base (all'interno di OnDragDrop) ed è invocabile anche dall'esterno in quanto public (benché, entrando nel merito, non ne capisca l'utilità visto che i metodi OnXXX sono destinati alla generazione di eventi e non dovrebbero essere accessibili da classi esterne a quella in cui tali metodi sono implementati).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446
    Nella classe discendente, potrai fare tranquillamente l'override del metodo che hai introdotto tu e che viene chiamato dalla classe base (all'interno di OnDragDrop) ed è invocabile anche dall'esterno in quanto public (benché, entrando nel merito, non ne capisca l'utilità visto che i metodi OnXXX sono destinati alla generazione di eventi e non dovrebbero essere accessibili da classi esterne a quella in cui tali metodi sono implementati).
    nel mio vecchio progetto avevo creato un nuovo componente TemporalLine in cui avevo una sorta di linea divisa in vari intervalli temporali e ogni volta che facevo il drag&drop di un'immagine, mi si aggiungeva un nuovo componente rettangolo.
    Così ho creato una libreria che contenesse le classi e i metodi di quel progetto.
    Ora nel mio nuovo progetto ho aggiunto il mio componente dalla toolbox e ho la mia linea temporale. Solo che vorrei che anche qui se faccio il drag&drop mi aggiunge i miei rettangoli.
    E devo cercare di utilizzare la libreria che ho creato senza aggiungere un nuovo evento Drag&drop...per questo che volevo sapere del metodo OnDragDrop.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    In tal caso, non capisco il problema. Basta che tu inserisca il codice all'interno del metodo OnDragDrop del componente, ridefinendolo con override, così come hai fatto inizialmente.

    L'errore è il tentativo di aumentare la sua visibilità, ma non c'è alcun motivo apparente per farlo in quanto non devi richiamare quel metodo da classi esterne, ma ci penserà l'implementazione base della classe da cui derivi a farlo quando è necessario, eseguendo quindi la tua implementazione ridefinita.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.