Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C#] Estensione di una classe
Forum - C# / VB.NET - [C#] Estensione di una classe

Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 0:19
Giovedì, 03/12/2009
Lo sò, può essere una cosa stupida eppure non riesco a trovare una soluzione ad un mio problema... Stò continuando un mio lavoro e per un fatto di ordine, semplicità e flessibilità ho deciso di ricostruirlo basandomi interamente su strutture, enumerazioni e classi. Una delle basi di questo progetto si basa su classi che si dovrebbero appogguare sul System.IO.FileStream ma è proprio questo che non riesco a fare...
Codice sorgente - presumibilmente C++

  1. class IO : FileStream
  2. {
  3.     public IO(string s)
  4.     {
  5.         this = new FileStream(s, FileMode.Open);
  6.     }
  7. }


Questa è una base dove si dovrebbero appoggiare un bel pò di classi, però mi viene dato un errore in fase di compilazione... 'IO' non contiene un costruttore che accetta argomenti '0'

Se provassi a creare la classe IO in questo formato ovviamente non mi da più l'errore nella classe IO, ma in tutte le classi che si basano su essa:
Codice sorgente - presumibilmente C++

  1. class IO
  2. {
  3.     FileStream fStream;
  4.     public IO(string s)
  5.     {
  6.         fStream = new FileStream(s, FileMode.Open);
  7.     }
  8. }
  9. class test : IO
  10. {
  11.     public test(string s)
  12.     {
  13.         this = new IO(s);
  14.     }
  15. }



Il codice errore è CS1729. Come potrei risolvere? ^^

PM Quote
Avatar
Gianluca87 (Ex-Member)
Expert


Messaggi: 300
Iscritto: 16/11/2008

Segnala al moderatore
Postato alle 1:27
Giovedì, 03/12/2009
Testo quotato

Postato originariamente da xeeynamo:

Lo sò, può essere una cosa stupida eppure non riesco a trovare una soluzione ad un mio problema... Stò continuando un mio lavoro e per un fatto di ordine, semplicità e flessibilità ho deciso di ricostruirlo basandomi interamente su strutture, enumerazioni e classi. Una delle basi di questo progetto si basa su classi che si dovrebbero appogguare sul System.IO.FileStream ma è proprio questo che non riesco a fare...
Codice sorgente - presumibilmente C++

  1. class IO : FileStream
  2. {
  3.     public IO(string s)
  4.     {
  5.         this = new FileStream(s, FileMode.Open);
  6.     }
  7. }


Questa è una base dove si dovrebbero appoggiare un bel pò di classi, però mi viene dato un errore in fase di compilazione... 'IO' non contiene un costruttore che accetta argomenti '0'

Se provassi a creare la classe IO in questo formato ovviamente non mi da più l'errore nella classe IO, ma in tutte le classi che si basano su essa:
Codice sorgente - presumibilmente C++

  1. class IO
  2. {
  3.     FileStream fStream;
  4.     public IO(string s)
  5.     {
  6.         fStream = new FileStream(s, FileMode.Open);
  7.     }
  8. }
  9. class test : IO
  10. {
  11.     public test(string s)
  12.     {
  13.         this = new IO(s);
  14.     }
  15. }



Il codice errore è CS1729. Come potrei risolvere? ^^



il problema è che stai cercando di astrarre FileStream:
FileStream secondo la documentazione di MSDN ha 15 tipi di costrutori diversi...nessuno dei quali senza argomenti... quindi non può funzionare...in oltre FileStream è già una classe astratta da Stream
la logica di base che stai usando è valida ma non dimenticare lo scopo per cui la stai usando...astrarre classi di questa natura potrebbe non essere un ottima idea...al massimo ti conviene includerle in classi custom fatte da te
un astrazzione del tipo che stai cercando di fare è utile principalmente quando si vuole fare un override dei metodi della classe in oltre ti consiglio di non usare nomi ambigui tipo IO , File ecc...


a domanda precisa, risposta precisa...
a domanda generica, risposta generica...
PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 15:23
Giovedì, 03/12/2009
IO era un esempio, dopo avrei modificato meglio la classe :). Comunque immaginavo che il problema era di questo tipo, di fatti ho pensato di rifare la classe con un altro sistema, anche se pure quello risulta non funzionante... Se dovessi risolvere il problema della seconda classe (che credo sia molto più semplice da risovlere...) come potrei fare? Purtroppo non ne capisco molto di estensioni di classi, override e compagnia bella, questo post ne è un esempio XD

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:54
Giovedì, 03/12/2009
Si risolve così:
Codice sorgente - presumibilmente C# / VB.NET

  1. class FileIO : System.IO.FileStream
  2. {
  3.    public FileIO(String s) : base(s,System.IO.FileMode.Open)
  4.    {
  5.                
  6.    }
  7. }


In pratica, il C# obbliga a creare completamente l'istanza della classe base (e quindi ad eseguire il costruttore della classe base) prima di passare a quella derivata. Tuttavia, dato che non esiste un costruttore senza parametri nella classe base, è impossibile completare l'istanziazione della classe base in primis, ecco perchè ti vien comunicato quell'errore. Quando si crea i costruttore di una classe derivata, quindi, è sempre bene chiamare come prima istruzione anche quello della classe base, ed in C# quella sopra mostrata è la sintassi giusta (in VB, si usa MyBase.New(...) passandogli i parametri adeguati).

@Gianluca: non ho ben capito perchè non è bene derivare da FileStream (che non è una classe astratta). Certo, dipende un po' dagli scopi: ad esempio, se quello che devi rappresentare è un generico flusso di dati per cui non esiste una classe in .NET, allora sarebbe meglio far derivare la classe direttamente da IO.Stream, poiché in questo modo concretizzeresti un nuovo concetto allo stesso livello degli altri Stream derivati (e potresti, allo stesso tempo, ridefinire tutti i metodi virtuali).


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 20:58
Giovedì, 03/12/2009
Perfetto, ti ringrazio :k:

PM Quote