2016-02-24 2 views
-2

Я работаю в проекте, где у меня есть эти классы:множественное наследование Java

public class Rectangle { 
    public void printMe() { 
     print("I am a Rectangle"); 
    } 
} 

public class Square extends Rectangle { 
    @Override 
    public void printMe() { 
     print("I am a Square"); 
    } 
} 

public class RedRectangle extends Rectangle { 
    @Override 
    public void printMe() { 
     super.printMe(); 
     print(" and I am red"); 
    } 
} 

Эти классы, в coures, есть другие методы и атрибуты.

Я хотел бы создать еще один класс RedSquare, который наследует все атрибуты и методы из Rectangle, но ему также необходимо переопределить свои методы с помощью тех, которые присутствуют в классе Square. Он напечатает «Я - квадрат, а я красный», используя код из классов RedRectangle и Square.

Он должен иметь возможность использовать методы из Square и RedRectangle, если это возможно, в противном случае он должен использовать методы из Rectangle, и он должен заставить разработчика писать из своего кода код для всех тех методов, которые были переопределены в как Square, так и RedRectangle.

Я действительно знаю, что это множественное наследование, и Java не поддерживает его, но мне нужно реализовать такое поведение.

Я попытался реализовать это, используя Square и RedRectangle как частные атрибуты, так или иначе, если я вызываю определенный метод RedRectangle.myMethod(), который вызывает внутренне другой метод, он будет использовать реализацию, содержащуюся в себе (или, в конечном счете, в супер прямоугольник) а не в RedSquare (или в конечном итоге на площади), где он был переопределен.

Есть ли какой-нибудь полезный шаблон, который я могу использовать с максимальным количеством повторного использования кода? Как бы вы это реализовали?

Большое спасибо.

+2

Вы можете использовать 'interfaces' ... Вы можете реализовать несколько' интерфейсов' в 'Java'. – brso05

+2

Не объясняйте проблемы в своем коде, не отправляя также код, который имеет проблему. –

+0

вы можете сделать что-то подобное в [java 8] (http://stackoverflow.com/questions/7857832/are-defaults-in-jdk-8-a-form-of-multiple-inheritance-in-java). –

ответ

1

То, с чем вы работаете, когда вы хотите, чтобы цвет для прямоугольника был атрибутом прямоугольника, а не подтипом прямоугольника. Здесь вы должны использовать композицию над наследованием, создавая класс ColorOfShape, который может быть атрибутом Rectangle.

class Rectangle { 
    ColorOfShape color; 
    void printMe() { printMeOnly(); printColor(); } 
    void printMeOnly() { print("I am a Rectangle"); } 
    void printColor() { color.printMe(); } 
} 
class Square extends Rectangle { 
    @Override void printMeOnly() { print("I am a Square"); } 
} 

abstract class ColorOfShape { 
    abstract void printMe(); 
} 
class RedColor extends ColorOfShape { 
    @Override void printMe() { print(" and I am red"); } 
} 
Смежные вопросы