I need to create a class/classes in C#...
No, è necessario creare un set di valori fissi. Quindi non pensare immediatamente alle classi. Lascia questa decisione fino a tardi.
Quindi, è necessario un insieme di valori, raggruppati per tipo di carta. La struttura che viene in mente quindi è un dizionario. La dimensione della carta è la chiave, gli aspetti di quella dimensione sono il valore.
Ora, a questo punto, dobbiamo prendere una decisione. Parli di molte proprietà di ogni formato di carta. Ma in realtà, sono necessari solo due: la larghezza e l'altezza. Da questo, è possibile calcolare tutte le proporzioni ecc. Quindi li calcoli manualmente una volta e definisci più proprietà, o semplicemente imposta la larghezza e l'altezza e calcoli gli altri valori in fase di runtime? Andiamo a calcolarli una sola volta in fase di esecuzione, all'avvio.
Quindi, con questo, ora sappiamo che abbiamo bisogno di una classe (o di una struct, se preferisci, visto che stiamo usando C # qui, ma resterò con una classe):
public sealed class PaperDetails
{
public PaperDetails(double width, double height)
{
Width = width;
Height = height;
AspectRatio = width/height;
...
}
public double Width {get;}
public double Height {get;}
public double AspectRatio {get;}
...
}
Quindi, dobbiamo identificare i tipi di carta. Un enum sembra la scelta ideale qui:
public enum PaperSizes
{
A4,
Letter,
...
}
Quindi possiamo creare il nostro dizionario:
private static readonly Dictionary<PaperSizes, PaperDetails> _paperTypes =
new Dictionary<PaperSizes, PaperDetails>
{
[PaperSizes.A4] = new PaperDetails(297, 420),
[PaperSizes.Letter] = new PaperDetails(270, 200),
...
};
Infine, abbiamo solo bisogno di una classe statica per incapsulare quel dizionario e per fornire accesso in sola lettura ad esso:
public static class PaperDetailsPerSize
{
private static readonly Dictionary<PaperSizes, PaperDetails> _paperTypes =
new Dictionary<PaperSizes, PaperDetails>
{
[PaperSizes.A4] = new PaperDetails(297, 420),
[PaperSizes.Letter] = new PaperDetails(270, 200),
...
};
public static PaperDetails GetPaperDetails(PaperSizes size) => _paperTypes[size];
}
Lavoro svolto e non è necessario preoccuparsi delle classi statiche che non sono in grado di implementare interfacce. Non abbiamo usato le costanti (tranne i valori di larghezza e altezza, che sono valori, non nominati, costanti). Se questo è un problema, quindi crea un gruppo di costanti con nome per definire quei valori e popolare il dizionario con loro.