Pregunta

¿Cómo escribiría una clase en C# que represente un color HSL y un color RGB?

Una vez que tengo eso, ¿es posible agregar un método que imprima cada uno de los atributos de clase? He oído hablar de ToString(), pero no estoy seguro de cómo usarlo.

Algún código de muestra sería muy útil, ya que soy un estudiante e intento aprender a usar C#. ¡Gracias!

¿Fue útil?

Solución

La gente se molesta cuando publica "preguntas" pidiendo a otros que escriban código para usted. Muchas preguntas de nuevos usuarios parecer pedir esto, y el tuyo incluso lo hace explícitamente. Esperemos que eso explique algunas de las reacciones negativas que ha encontrado de otros usuarios, ya sea en votación descendente, votando para cerrar o incluso eliminar sus preguntas. Espero que esto no te haya dado una experiencia tan negativa aquí que estés alejado. En el futuro, encontrará que las personas están mucho más dispuestas a ayudarlo si muestra alguna evidencia de haber tratado de ayudarse primero. Muéstranos un código que ha escrito (pero no está funcionando), o sugiere algunas formas posibles en que haya intentado resolver el problema usted mismo. La mayoría de las preguntas no son "demasiado triviales", sino que no son preguntas reales. No somos un servicio de redacción de códigos, pero todavía estamos felices de ayudar.

Dicho esto, intentaré continuar respondiendo la pregunta como lo hice en un comentario. Aunque solo sea porque me encantan las preguntas de codificación que tratan con conversiones de color y espacio de color. La pregunta de cómo convertir entre espacios de color ya se ha hecho y respondida varias veces aquí. Por ejemplo, yo (y varios otros) proporcioné un algoritmo (en varios idiomas diferentes) aquí. Debería ser simple convertir cualquiera de ellos a cualquier idioma que elija.

En cuanto a "cómo escribo una clase para representar valores en esos espacios de color", eso es bastante simple. Una búsqueda en Google también habría creado varios resultados de personas que ya habían hecho lo mismo. Personalmente, recomiendo crear un estructura, en lugar de una clase, porque es un objeto muy liviano y los valores de color son inmutables (lo que significa que no cambian). Esa es perfecta para una estructura, y si desea más explicación de la diferencia, puede encontrar que pregunta posee ya me han pedido y respondido aquí también.

Pero lo que elija, el resultado final se ve muy similar. Supongo que si esto es para una clase de programación, ya se le ha enseñado todo lo que necesita saber para poder hacerlo usted mismo. Es decir, ya debería haber aprendido sobre campos privados (variables de miembros), propiedades públicas y métodos. Comenzará creando una estructura con 3 campos privados para representar cada uno de los valores de color; Hue (h), saturación (s) y ligereza (l). Probablemente deberían ser de tipo Integer, Debido a que los valores de color individuales son números enteros entre 0 y 100, o 0 y 360. Si le importó la máxima precisión, puede almacenarlos como tipo Decimal y manejar la conversión a Integer En las propiedades públicas que los exponen al mundo, pero dudo que esto sea necesario aquí. En cualquier caso, luego deberá crear esas propiedades públicas que expongan sus campos privados al mundo. Este es un concepto básico en la programación orientada a objetos, y no debe ser uno nuevo para usted. (Si es así, realmente necesita detenerse ahora y obtener un libro que le explique OOP. No pase Go, no recolecte $ 200). Esas propiedades públicas deben ser de tipo Integer, debe haber 3 de ellos para cada uno de los valores de los componentes de color individuales, y deberían (al menos si está creando una estructura inmutable) de solo lectura (incluye solo un Getter, no un setter). Algo como esto:

/// <summary>
/// Represents an HSL color, composed of individual
/// Hue, Saturation, and Lightness attributes.
/// </summary>
public struct HSLColor
{
    private int _hue;
    private int _saturation;
    private int _lightness;

    /// <summary>
    /// The hue attribute of the color.
    /// (This is a value, in degrees, from 0 to 360.)
    /// </summary>
    public int Hue
    {
        get { return _hue; }
    }

    /// <summary>
    /// The saturation attribute of the color.
    /// (This is a percentage between 0 and 100.)
    /// </summary>
    public int Saturation
    {
        get { return _saturation; }
    }

    /// <summary>
    /// The lightness attribute of the color.
    /// (This is a percentage between 0 and 100.)
    /// </summary>
    public int Lightness
    {
        get { return _lightness; }
    }
}

Finalmente, dices que necesitas anular el ToString método. Como ya debería haber aprendido, este método es proporcionado por cada clase en el marco .NET porque está heredado de la base Object. Por supuesto, está marcado como virtual, que le permite anularlo y proporcionar su propia implementación. La parte más difícil es descubrir cómo debería ser su valor de retorno. Puede optar por representar el color como una tríada, que muestra sus tres valores de componentes individuales. En cualquier caso, deberá utilizar el String.Format método, que le permite crear una cadena que incluye "elementos de formato" que se reemplazan por el valor del objeto correspondiente. Por ejemplo, así es como lo hago:

/// <summary>
/// Returns the "(HH, SS, LL)" representation of this HSLColor structure.
/// </summary>
public override string ToString()
{
    return string.Format("({0}, {1}, {2})",
                         this.Hue,
                         this.Saturation,
                         this.Lightness);
}

Eso debería ser suficiente para comenzar. yo altamente Anime a no solo copiar y pegar el código proporcionado aquí como su tarea. No estás aprendiendo nada de esta manera. Enciende tu IDE, escribe el código tú mismo y prueba un par de variaciones diferentes. Asegúrese de comprender cómo funciona, qué he hecho y cómo podría hacerlo nuevamente por su cuenta. ¡La mejor de las suertes!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top