È una classe vuota in alcuni casi corretta

1

So che in genere è un difetto del design avere una classe vuota, eppure mi chiedo se ci siano casi in cui non è necessario avere una classe vuota (astratta) per raggruppare oggetti. Soprattutto quando è necessario il polimorfismo.

Ad esempio, ho un gruppo posizione . Possono consistere in un'area , una riga (una strada per esempio) o uno specifico punto (come una casa). Nella struttura dei dati richiede solo di contenere le coordinate.

So che tutti hanno almeno un singolo punto in comune, tuttavia è davvero bizzarra la proprietà quando avrei una coordinata nella mia classe location .

Al momento stavo pensando alla seguente soluzione:

public abstract class Location {

}

public class Point: Location 
{
    public double X {get;set;}
    public double Y {get;set;}
}

public class Line : Location
{
    public double StartX {get;set;}
    public double StartY {get;set;}
    public double EndX {get;set;}
    public double EndY {get;set;}
}

So che non è un esempio perfetto in quanto vi è un'altra soluzione più corretta in questo caso e probabilmente ci sono oggetti per questa soluzione trovata nelle librerie .Net.

Ma come sono risolte le cose in generale?

    
posta Echarnus 23.06.2016 - 09:43
fonte

2 risposte

5

Il polimorfismo senza interfaccia condivisa consentirà SOLO di archiviare oggetti nello stesso contenitore (strongmente tipizzato), in realtà NON fare nulla. Non puoi eliminare le chiamate ai metodi o qualcosa del genere.

Nel tuo esempio specifico, penso che la composizione sarebbe più appropriata, no? Hai già un'astrazione per un punto specifico nello spazio 2d, quindi perché non la riutilizzi nella tua astrazione di tutti i punti tra due punti?

public class Point
{
    public double X { get; }
    public double Y { get; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

public class Line
{
    public Point Start { get; }
    public Point End { get; }

    public Line(Point start, Point end)
    {
        Start = start;
        End = end;
    }
}

EDIT: Vorrei anche ricordare che avere Line ereditato da Location è fuorviante. Una linea nel senso matematico (euclideo) è un insieme di punti definiti da due punti. Ovviamente, se quello che ti interessa sono SOLO i punti TRA i punti di inizio / fine, allora quello che hai non è una linea, ma un line segment .

    
risposta data 23.06.2016 - 10:03
fonte
2

Le due sottoclassi non hanno alcuna interfaccia in comune, quindi perché vuoi che siano ereditate da una classe comune in primo luogo? La classe Location non ti offre alcun vantaggio, per quanto ne so io.

A me sembrerebbe più logico che il Line contenga due% di% di %%.

    
risposta data 23.06.2016 - 09:49
fonte

Leggi altre domande sui tag