2009-05-06 16 views
6

Supongamos que tengo una clase "Artículo", que tiene tres variables miembro: nombre de cadena, cantidad decimal y unidad de cadena. Tengo propiedades get/set públicas en las tres.ToString() para una propiedad de clase?

A veces, quiero mostrar la cantidad como texto junto con la unidad correcta, ej. 10 metros o 100 pies.

Mi pregunta es, ¿es posible tener algún tipo de función ToString() para las propiedades también, para que su salida de texto se pueda personalizar?

Gracias,

Saurabh.

+0

¡Vaya tantas soluciones!Elegir una respuesta se vuelve realmente difícil, como IMO, muchas de las soluciones sugeridas parecen correctas y útiles. Dos puntos: 1. Hay una IU, por ahora. Sin embargo, aún quiero hacer ese "formateo" dentro del objeto, porque parece ser tan inherente a ese objeto, devolver su cantidad junto con la unidad, cuando no estoy involucrado en algunos cálculos. 2. Por ahora, voy con la solución de Fredrik, ya que me proporciona una nueva propiedad lista para usar, sin los "inconvenientes" de un nuevo objeto para cantidad + unidad. – virtualmic

+0

@virtualmic - Puede ser la solución más simple, pero no creo que sea la correcta. Tendrá que pagar el impuesto de mantenimiento de las preocupaciones de mezcla en algún momento. –

+0

Gracias Greg, por tu preocupación. Definitivamente probaré otros enfoques también, como tú y Anton han sugerido. Gracias de nuevo, ¡a todos! – virtualmic

Respuesta

13

Lo que puede hacer es hacer una nueva (sólo lectura) Propiedad devolver una versión formateada:

public string QuantityAsString 
{ 
    get 
    { 
     return string.Format("{0} {1}", this.Quantity, this.Unit); 
    } 
} 
1

Usted tiene dos opciones:

  1. tienen la ToString() de la clase padre añadirá automáticamente estas piezas juntas en un formato agradable.
  2. envolver las propiedades en las clases y proporcionar un ToString() para las clases
6

En términos generales , el formato de los valores a las unidades apropiadas no es responsabilidad de la clase Item. Por el contrario, esto debe hacerse por alguna clase externa.

Sin embargo, si usted realmente quiere hacer el formateo dentro de la clase, me gustaría recomendar la definición de una clase Unit con implicit conversion operators para convertir a decimal o int s y toda la lógica formato requerido.

+0

Estoy de acuerdo. El formateo es un problema de capa de presentación y no debe encapsularse en la clase de entidad de capa de dominio. – JacobE

+0

No necesariamente. Si el objeto puede hacer cosas sensibles con sus unidades, como la conversión entre ellos, etc., entonces es algo que debería estar en el objeto mismo. ¿Y quién dice que hay una IU? –

+0

@Greg ¿Por qué entonces querría "mostrar la cantidad como texto"? –

2

Creo que el mejor enfoque desde el punto de vista de la calidad del código es crear una clase que ajuste el valor con la unidad y proporcione .ToString() allí.

8

Parece que su modelo de objetos no está correctamente factorizado. Lo que probablemente desee hacer es abstraer Unit y Quantity en otro objeto y luego puede anular ToString para eso. Esto tiene la ventaja de mantener juntos los valores dependientes y de permitirle implementar cosas como conversiones entre unidades en el futuro (por ejemplo, conversión de inchest a feet, etc.), p.

public struct Measure 
{ 
    public Measure(string unit, decimal quantity) 
    { 
     this.Unit = unit; 
     this.Quantity = quantity; 
    } 

    public string Unit { get; private set; } 
    public decimal Quantity { get; private set; } 

    public override string ToString() 
    { 
     return string.Format("{0} {1}", this.Quantity, this.Unit); 
    } 
} 

public class Item 
{ 
    public string Name { get; set; } 
    public Measure Measure { get; set; } 

    public override string ToString() 
    { 
     return string.Format("{0}: {1}", this.Name, this.Measure); 
    } 
} 

Tenga en cuenta que he cometido Measure una estructura aquí, ya que probablemente tiene la semántica de valor. Si toma este enfoque, debe hacerlo inmutable y anular Equals/GetHashCode, como es apropiado para una estructura.

1

podría implementar la interfaz IFormatable tener diferente de

public class Item : IFormattable 
{ 
    public string Name; 
    public decimal Quantity; 
    public string Unit; 

    public override string ToString(string format, IFormatProvider provider) 
    { 
     switch(format) 
     { 
      case "quantity": return Quantity + Unit; 
      default: return Name; 
     } 
    } 
} 

ToString Esto puede ser usado como esto: hace

Item item = new Item(); 
Console.WriteLine(item.ToString()); 
Console.WriteLine("Quantity: {0:quantity}", item); 
+0

predeterminado aquí probablemente debería arrojar una FormatException ... –

+0

De acuerdo, y debería haber un caso para string.Empty o "" también ... –

0

Unos días he implementado el mismo modelo. E hice clases separadas para Cantidad y Unidad. Se ve así (se simplifica, de hecho hay constructores y operadores sobrecargados):

class Quantity 
{ 
    public decimal Value; 
    public UnitOfMeasure Unit; 

    public override string ToString() 
    { 
     return string.Format("{0} {1}", Value, Unit); 
    } 
} 

class UnitOfMeasure 
{ 
    public string Name; 

    public override string ToString() { return Name; } 
} 
Cuestiones relacionadas