Каков наилучший подход для доступа к конкретным методам подкласса с использованием Java?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Каков наилучший подход для доступа к конкретным методам подкласса с использованием Java?

Сообщение Anonymous »

Предположим, у меня есть следующий тривиальный пример:

Код: Выделить всё

// 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());
}
}
Если я хочу получить доступ к методу SquareSpecificMethod()

Я могу сделать следующее, но потенциально мне придется делать это несколько раз в разных местах:

Код: Выделить всё

        ((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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»