Hallo,
ich habe eine Frage zu einer von mir geschriebenen Klassenhierachie. Es geht um zwei Klassen, welche RGB-Farben kapseln.
Die Klassen habe ich mal unten eingefügt. Unelegant ist aus meiner Sicht die Methode setIntensity(Double). Diese wird in der Klasse RGBColor
definiert und hat den Rückgabetyp RGBColor. Innerhalb der Mathode wird eine Metode setColor aufgerufen, die den Wert zurückgibt.
Diese habe ich in der abgeleiteten Klasse GRBWColor überschrieben und der Rückgabetyp ist hier RGBWColor.
In der abgeleiteten Klasse RGBWColor#setIntensity muss ich aber jetzt einen Cast auf RGBWColor machen, damit es sauber kompiliert.
Frage : Wie kann ich das eleganter lösen ohne den Cast und ohne redundanten Code ?
Wäre über Hilfe sehr dankbar !
Gruss Marco
ich habe eine Frage zu einer von mir geschriebenen Klassenhierachie. Es geht um zwei Klassen, welche RGB-Farben kapseln.
Die Klassen habe ich mal unten eingefügt. Unelegant ist aus meiner Sicht die Methode setIntensity(Double). Diese wird in der Klasse RGBColor
definiert und hat den Rückgabetyp RGBColor. Innerhalb der Mathode wird eine Metode setColor aufgerufen, die den Wert zurückgibt.
Diese habe ich in der abgeleiteten Klasse GRBWColor überschrieben und der Rückgabetyp ist hier RGBWColor.
In der abgeleiteten Klasse RGBWColor#setIntensity muss ich aber jetzt einen Cast auf RGBWColor machen, damit es sauber kompiliert.
Frage : Wie kann ich das eleganter lösen ohne den Cast und ohne redundanten Code ?
Wäre über Hilfe sehr dankbar !
Gruss Marco
Java:
public class RGBColor
{
private static final Integer MIN = Integer.valueOf(0);
private static final Integer MAX = Integer.valueOf(255);
protected static final MathContext MATH_CTX = new MathContext(3, RoundingMode.HALF_UP);
public static final RGBColor GREEN = new RGBColor(0, 255, 0);
private Integer red;
private Integer green;
private Integer blue;
public RGBColor(Integer red, Integer green, Integer blue)
{
this();
this.red = red;
this.green = green;
this.blue = blue;
}
public RGBColor()
{
super();
}
public Integer getRed()
{
return red;
}
public void setRed(Integer red)
{
this.red = red;
}
public Integer getGreen()
{
return green;
}
public void setGreen(Integer green)
{
this.green = green;
}
public Integer getBlue()
{
return blue;
}
public void setBlue(Integer blue)
{
this.blue = blue;
}
@Override
public String toString()
{
return "red=" + red + ", green=" + green + ", blue=" + blue;
}
protected Integer limit(Integer value){
if(value != null){
value = value.compareTo(MIN) < 0 ? MIN : value;
value = value.compareTo(MAX) > 0 ? MAX : value;
}
return value;
}
public void limit(){
setRed(limit(getRed()));
setGreen(limit(getGreen()));
setBlue(limit(getBlue()));
}
public static RGBColor valueOf(String value)
{
RGBColor result = new RGBColor();
String[] colors = value.split(",");
result.setRed(Integer.valueOf(colors[0]));
result.setGreen(Integer.valueOf(colors[1]));
result.setBlue(Integer.valueOf(colors[2]));
return result;
}
@Override
public int hashCode()
{
return red.hashCode() + green.hashCode() + blue.hashCode();
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof RGBColor)
{
RGBColor other = (RGBColor) obj;
return red.equals(other.red) && green.equals(other.green) && blue.equals(other.blue);
} else
{
return false;
}
}
public RGBColor setIntensity(Double intensity)
{
Double maxIntensity = getMaxIntensity();
if (maxIntensity.compareTo(Double.valueOf(0.0)) > 0)
{
return createColor(intensity, maxIntensity);
} else {
Integer newColor = Double.valueOf((255 * intensity) / 100).intValue();
return createColor(newColor);
}
}
protected RGBColor createColor(Double intensity, Double maxIntensity)
{
return new RGBColor(
getColorFromIntensity(intensity, red, maxIntensity),
getColorFromIntensity(intensity, green, maxIntensity),
getColorFromIntensity(intensity, blue, maxIntensity));
}
protected RGBColor createColor(Integer color)
{
return new RGBColor(color, color, color);
}
/**
* computes the intensity by the assigned color code.
*
* @param colorValue the color value 0 <= x <= 255
* @return a percentage value 0 <= x <= 100.
*/
protected static Integer getColorFromIntensity(Double intensity, Integer colorValue, Double currentIntensity)
{
return Double.valueOf(colorValue * intensity / currentIntensity).intValue();
}
public Double getMaxIntensity()
{
BigDecimal d = new BigDecimal(Math.max(Math.max(getIntensityFromColor(red), getIntensityFromColor(green)), getIntensityFromColor(blue)), MATH_CTX);
return d.doubleValue();
}
/**
* computes the intensity by the assigned color code.
*
* @param colorValue the color value 0 <= x <= 255
* @return a percentage value 0 <= x <= 100.
*/
public static Double getIntensityFromColor(Integer colorValue)
{
BigDecimal d = new BigDecimal(colorValue.doubleValue() * 100 / 255, MATH_CTX);
return d.doubleValue();
}
}
public class RGBWColor extends RGBColor
{
private Integer white;
public RGBWColor(Integer red, Integer green, Integer blue, Integer white)
{
super(red, green, blue);
this.setWhite(white);
}
public RGBWColor()
{
}
public RGBWColor(RGBColor rgbColor, Integer white)
{
this(rgbColor.getRed(), rgbColor.getGreen(), rgbColor.getBlue(), white);
}
public Integer getWhite()
{
return white;
}
public void setWhite(Integer white)
{
this.white = white;
}
@Override
public String toString()
{
return super.toString() + ", white=" + white;
}
public static RGBWColor valueOf(String value)
{
RGBWColor result = new RGBWColor();
String[] colors = value.split(",");
result.setRed(Integer.valueOf(colors[0]));
result.setGreen(Integer.valueOf(colors[1]));
result.setBlue(Integer.valueOf(colors[2]));
result.setWhite(Integer.valueOf(colors[3]));
return result;
}
@Override
public void limit(){
super.limit();
white = limit(getWhite());
}
@Override
public int hashCode()
{
return super.hashCode() + white.hashCode();
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof RGBWColor)
{
RGBWColor other = (RGBWColor) obj;
return super.equals(obj) && white.equals(other.white);
} else
{
return false;
}
}
@Override
public Double getMaxIntensity()
{
BigDecimal d = new BigDecimal(Math.max(super.getMaxIntensity(), getIntensityFromColor(white)), MATH_CTX);
return d.doubleValue();
}
@Override
protected RGBWColor createColor(Double intensity, Double maxIntensity)
{
RGBColor rgbColor = super.createColor(intensity, maxIntensity);
return new RGBWColor(rgbColor, getColorFromIntensity(intensity, white, maxIntensity));
}
@Override
protected RGBWColor createColor(Integer color)
{
RGBColor rgbColor = super.createColor(color);
return new RGBWColor(rgbColor, color);
}
@Override
public RGBWColor setIntensity(Double intensity)
{
return (RGBWColor) super.setIntensity(intensity);
}
}
Zuletzt bearbeitet von einem Moderator: