Код: Выделить всё
// This is provided to me from another jar so cannot be changed.
public interface Shape {
double calculateArea();
double calculatePerimeter();
}
public class Triangle implements Shape {
private double side1;
private double side2;
private double side3;
public Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
@Override
public double calculateArea() {
// Heron's formula to calculate area of a triangle
double s = (side1 + side2 + side3) / 2;
return Math.sqrt(s * (s - side1) * (s - side2) * (s - side3));
}
@Override
public double calculatePerimeter() {
return side1 + side2 + side3;
}
}
public class Square implements Shape {
private double side;
public Square(double side) {
this.side = side;
}
@Override
public double calculateArea() {
return side * side;
}
@Override
public double calculatePerimeter() {
return 4 * side;
}
public void squareSpecificMethod(){
// Does something specific for squares only
}
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
@Override
public double calculatePerimeter() {
return 2 * Math.PI * radius;
}
}
public class Main {
public static void main(String[] args) {
// Example usage
Shape triangle = new Triangle(3, 4, 5);
System.out.println("Triangle Area: " + triangle.calculateArea());
System.out.println("Triangle Perimeter: " + triangle.calculatePerimeter());
Shape square = new Square(5);
System.out.println("Square Area: " + square.calculateArea());
System.out.println("Square Perimeter: " + square.calculatePerimeter());
Shape circle = new Circle(3);
System.out.println("Circle Area: " + circle.calculateArea());
System.out.println("Circle Perimeter: " + circle.calculatePerimeter());
}
}
Я могу сделать следующее, но потенциально мне придется делать это несколько раз в разных местах:
Код: Выделить всё
((Square) square).squareSpecificMethod();
Код: Выделить всё
if (square instanceof Square) {
((Square) square).squareSpecificMethod();
}
Код: Выделить всё
Square square = new Square(5);
Как мне избежать необходимости приведения или использования экземпляра instanceOf из того, что я Вы читали, что это может быть потенциальным запахом кода?
Я изо всех сил пытаюсь найти лучший способ получить конкретный класс во время выполнения, когда мне может потребоваться вызвать методы, специфичные для реализации, но, возможно, не знаю реализацию до момента выполнения.
Я столкнулся бы с той же проблемой, если бы добавил определенные методы в другие реализации.
И было бы обременительно проверять экземпляр или приведение типов в нескольких местах p>
Ограничено Java 11
Подробнее здесь: https://stackoverflow.com/questions/781 ... s-using-ja