View Full Version : [C#]Dubbio Interfacce/ereditarietà
RaouL_BennetH
14-04-2009, 13:10
Ciao :)
Riprendo un 3d che non riesco più a trovare che ho aperto qualche tempo fa (sorry).
Ho un grosso dubbio sulla comprensione del concetto di interfaccia.
In sostanza, dovendo gestire delle anagrafiche (di tipi diversi), stavo ragionando così:
interface IAnagrafica
{
void add(Anagrafica anagrafica);
void update(Anagrafica anagrafica);
void deleteLogical(Anagrafica anagrafica);
Anagrafica getById(int id);
Anagrafica getByFilter(string filter);
ICollection<Anagrafica> getByDomain(string domain);
}
public class Anagrafica : IAnagrafica
{
//iniziano i dubbi:
}
...con la premessa che so che devo implementare tutti i metodi che sono presenti nell'interfaccia.....
Ho due tipi di anagrafica: Anagrafica Persone e Anagrafica Fornitori
Seguendo la regola "is-a", AnagraficaPersone e AnagraficaFornitori, seppur abbiano pochi campi in comune "sono" oggetti di tipo Anagrafica. Ho pensato quindi che :
public class AnagraficaPersone : Anagrafica
{
}
public class AnagraficaFornitori : Anagrafica
{
}
Non ho ancora ben chiaro come debba definire l'entità generica "Anagrafica".
Pensavo di definire in Anagrafica solo ciò che ho definito nell'interfaccia, e successivamente, far ereditare i metodi di Anagrafica ad AnagraficaPersone ed AnagraficaFornitori. I campi di queste ultime però, essendo diversi fra di loro, li avrei definiti solo al loro interno.
Che ne pensate?
Grazie :)
RaouL.
qwerty86
14-04-2009, 13:26
Si credo vada bene così!
Ciò che devi definire nell'interfaccia Anagrafica non è l'insieme delle caratteristiche comuni a tutte le classi che sono delle anagrafiche ma l'insieme delle caratteristiche necessarie affinchè degli oggetti di tipo anagrafica possano "comunicare" con oggetti di tipo diverso senza perdere la propria identità esclusiva.
Tutte queste caratteristiche saranno anche le caratteristiche che avranno le anagrafiche.
Senza un'idea di come siano fatti gli oggetti che devono usare le anagrafiche ogni insieme di caratteristiche comuni a tutte le anagrafiche concrete è valido.
RaouL_BennetH
14-04-2009, 14:05
Bene...
ho ampliato così:
using System;
using System.Collections.Generic;
using System.Text;
using Employees.Interfaces;
namespace Employees.Entities
{
public class Anagrafica : IAnagrafica
{
private int id;
private string filter;
private string kind;
private bool isActive;
public int Id
{
get { return id; }
set { id = value; }
}
public string Filter
{
get { return filter; }
set { filter = value; }
}
public string Kind
{
get { return kind; }
set { kind = value; }
}
public bool IsActive
{
get { return isActive; }
set { isActive = value; }
}
public void Add(Anagrafica anagrafica)
{
throw new NotImplementedException();
}
public void Update(Anagrafica anagrafica)
{
throw new NotImplementedException();
}
public void RemoveLogical(Anagrafica anagrafica)
{
throw new NotImplementedException();
}
public Anagrafica GetById(int id)
{
throw new NotImplementedException();
}
public Anagrafica GetByFilter(string filter)
{
throw new NotImplementedException();
}
public ICollection<Anagrafica> GetByKind(string kind)
{
throw new NotImplementedException();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Employees.Entities
{
public class AnagraficaDipendenti : Anagrafica
{
#region Incapsulamento
private string nome;
private string cognome;
private string sesso;
private DateTime dataNascita;
private string comuneNascita;
private string provinciaNascita;
private string stato;
private string codiceFiscale;
private string comuneResidenza;
private string provinciaResidenza;
private string indirizzo;
private string cap;
private string email;
public virtual string Nome
{
get { return nome; }
set { nome = value; }
}
public virtual string Cognome
{
get { return cognome; }
set { cognome = value; }
}
public virtual string Sesso
{
get { return sesso; }
set { sesso = value; }
}
public virtual DateTime DataNascita
{
get { return dataNascita; }
set { dataNascita = value; }
}
public virtual string ComuneNascita
{
get { return comuneNascita; }
set { comuneNascita = value; }
}
public virtual string ProvinciaNascita
{
get { return provinciaNascita; }
set { provinciaNascita = value; }
}
public virtual string Stato
{
get { return stato; }
set { stato = value; }
}
public virtual string CodiceFiscale
{
get { return codiceFiscale; }
set { codiceFiscale = value; }
}
public virtual string ComuneResidenza
{
get { return comuneResidenza; }
set { comuneResidenza = value; }
}
public virtual string ProvinciaResidenza
{
get { return provinciaResidenza; }
set { provinciaResidenza = value; }
}
public virtual string Indirizzo
{
get { return indirizzo; }
set { indirizzo = value; }
}
public virtual string Cap
{
get { return cap; }
set { cap = value; }
}
public virtual string Email
{
get { return email; }
set { email = value; }
}
#endregion
#region Costruttori
public AnagraficaDipendenti()
{
}
public AnagraficaDipendenti(string cognome, string nome, string sesso,
DateTime dataNascita, string comuneNascita, string provinciaNascita,
string stato, string codiceFiscale, string comuneResidenza,
string provinciaResidenza, string indirizzo, string cap, string email,
bool isActive)
{
this.cognome = cognome;
this.nome = nome;
this.sesso = sesso;
this.dataNascita = dataNascita;
this.comuneNascita = comuneNascita;
this.provinciaNascita = provinciaNascita;
this.stato = stato;
this.codiceFiscale = codiceFiscale;
this.comuneResidenza = comuneResidenza;
this.provinciaResidenza = provinciaResidenza;
this.indirizzo = indirizzo;
this.cap = cap;
this.email = email;
}
#endregion
#region Methods
#endregion
}
}
Non riesco a capire come implementare il metodo "Add" di Anagrafica per AnagraficaDipendente.
Grazie mille :)
RaouL.
P.S.:
@PGI-Bis : non avevo ancora letto il tuo commento .
mindwings
14-04-2009, 14:19
Ciao :)
Riprendo un 3d che non riesco più a trovare che ho aperto qualche tempo fa (sorry).
Ho un grosso dubbio sulla comprensione del concetto di interfaccia.
In sostanza, dovendo gestire delle anagrafiche (di tipi diversi), stavo ragionando così:
interface IAnagrafica
{
void add(Anagrafica anagrafica);
void update(Anagrafica anagrafica);
void deleteLogical(Anagrafica anagrafica);
Anagrafica getById(int id);
Anagrafica getByFilter(string filter);
ICollection<Anagrafica> getByDomain(string domain);
}
Non ho capito il significato dei metodi, stando alla definizione di wikipedia
un'anagrafica e' un archivio contenente i dati anagrafici del soggetto interessato. Ad un'anagrafica e' possibile aggiungere un'altra anagrafica? (metodo add?) Che significa deleteLogical?
Il fatto che ci siano poi 3 metodi get mi fa pensare che IAnagrafica e'solo un'involucro a piu' Anagrafiche(Ma l'anagrafica non e' unica?)...
EDIT: Ho appena visto l'implementazione... Tutti quei private mi sembrano inutili dato che fornisci le chiavi d'accesso e modifica get e set potresti mettere
direttamente i campi come public...
banryu79
14-04-2009, 14:24
Riprendo un 3d che non riesco più a trovare che ho aperto qualche tempo fa (sorry).
Eccoti il link, casomai ti servisse ancora: http://www.hwupgrade.it/forum/showthread.php?t=1956932
RaouL_BennetH
14-04-2009, 14:31
Non ho capito il significato dei metodi, stando alla definizione di wikipedia
un'anagrafica e' un archivio contenente i dati anagrafici del soggetto interessato. Ad un'anagrafica e' possibile aggiungere un'altra anagrafica? (metodo add?) Che significa deleteLogical?
Il fatto che ci siano poi 3 metodi get mi fa pensare che IAnagrafica e'solo un'involucro a piu' Anagrafiche(Ma l'anagrafica non e' unica?)...
Forse il nome che ho usato per l'interfaccia non è il più azzeccato.
con add e deleteLogical intendevo semplicemente aggiungere un'anagrafica che può essere di due tipi:
add(AnagraficaPersona)
oppure
add(AnagraficaFornitore)
ma le potrei anche chiamare semplicemente: Persona e Fornitore.
Per i metodi get:
mi sembrava il minimo utilizzare un metodo che mi identificasse il record. Per lo stringFilter invece, ho pensato che un utente potrebbe fare una ricerca su un qualsiasi campo di un'anagrafica e quindi, anzichè preventivare un "where or, or, or" per ciascuna campo, passo di volta in volta il valore selezionato dall'utente.
per il 'deleteLogical' intendo semplicemente non fare mai una cancellazione fisica ma settare a false o a zero un campo. Dove questo campo ha valore false, il record non verrà restituito ma potrà successivamente essere riattivato.
EDIT:
aggiungo anche che:
l'applicazione si interfaccia ad un db.
Nel db ci sono diversi tipi di anagrafiche(servizi, fornitori, contatti, dipendenti, etc..)
Per questo mi sembrava buona l'idea di avere una interfaccia implementata da un'unica classe base (anagrafica) e che le altre estendessero quest'ultima.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.