2012-02-05 4 views
2

я хочу сделать что-то вроде этого в Java:ява создать конструктор в подклассе с суперкласса в качестве аргументов

суперкласса:

public class mysupclass { 

    public mysupclass(int x, int y) { 
     // code here 
    } 
} 

Подкласс:

public class mysubclass extends mysupclass { 

    public mysubclass (mysupclass a, mysupclass b) { 
     // code here 
    } 
} 

Как определить mysupclass, как аргументы для моего конструктора подкласса? Должен ли я использовать супер в конструкторе подкласса и что я должен добавить в супер?

Заранее благодарен!

+0

какой прецедент? – Bohemian

ответ

0

Как правило, суперкласс должен НИКОГДА знать о подклассе.

Подумайте о перепроектировании иерархии классов или используйте абстракцию, такую ​​как подкласс, реализующий интерфейс, и суперкласс, ожидающий в том числе этого интерфейса.

+0

Суперкласс имеет * не знает о подклассе - посмотрите на текст mysupclass; он не упоминает mysubclass. –

+0

Честно говоря, Джон прав. Я не рассказывал никому о подклассе :) Спасибо, что ответили на него. – Spyros

1

Для вызова конструктора суперкласса вам обязательно нужно будет использовать super, но какие аргументы вы хотите использовать, зависит от вас. Мы понятия не имеем, что означают классы.

Тот факт, что конструктор подкласса имеет параметры типа суперкласса, в основном не имеет отношения к Java, это просто совпадение. Вам нужно следовать всем нормальным правилам Java, которые в этом случае означают привязку к конструктору суперкласса. Поскольку у вас нет конструктора без параметров в суперклассе, вы должны сделать это явно, предоставляя значения для x и y.

+0

Привет и спасибо за ответ. Любые подсказки, что я должен использовать как супер? public mysubclass (mysupclass a, mysupclass b) { super (a, b); } не будет работать :( – Spyros

+1

@Spyros: Ну нет, потому что суперконструктор объявлен принимать два значения 'int', и вы пытаетесь передать два значения' mysupclass'. Мы понятия не имеем, что эти классы (или параметры конструктора в любом классе) предназначены для представления, поэтому я не могу предложить значения. –

+0

Еще раз спасибо за ответ. Если mysupclass - это пара int, то mysubclass - 2 pers int, поэтому a и b могут be s'th like (0,0) или (1,2) и т. д. Помогает ли это? – Spyros

-1

Возможно, вы захотите добавить конструктор по умолчанию, поскольку общая практика кодирования говорит, что если вы перегружаете конструктор по умолчанию, вы должны добавить его обратно в себя. Прежде чем продолжить, вы можете сделать некоторые исследования в конструкторах java.

supclass:

public class mysupclass { 

    public mysupclass(int x, int y) { 
     // code here 
     // Overloaded constructor. 
    } 
} 

Подкласс:

public class mysubclass extends mysupclass { 

    public mysubclass() { 
     super(mysupclass a, mysupclass b); 
     // code here 
    } 
} 
0

Ну я думаю, у изгоняются рассмотреть вопрос редактирования ур и дать более подробную информацию о том, что mysupclass представляют в context.As другие уже объяснили ур пытаются передать mysupclass в качестве аргумента в конструктор mysupclass, который фактически ожидает значение int как параметр. Очевидно, если ur не передает int value в конструкцию tor mysupclass, класс не может быть инстанцирован как u r, предоставляющий параметризованный конструктор, и он не будет вызывать конструктор по умолчанию. Пожалуйста, уточните, на какие требования ур? я имею в виду, что вы хотите сделать, передав эти mysupclass в качестве аргументов? потому что ему проще установить переменные u, которые хотите передать в конструкторе, используя super.variable=value;, а прямо передавая mysupclass в качестве аргумента.

0

Ссылка для вас: how to inherit Constructor from super class to sub class

Решение ниже:

Superclass:

public class mysupclass { 

    public mysupclass(int x, int y) { 
     // code here 
    } 
} 

Подкласс:

public class mysubclass extends mysupclass { 

    public mysubclass (mysupclass a, mysupclass b) { 
     //call to constructor of superclass 
     mysupclass(a,b); 
     // code here 
    } 
} 
0

Здесь вы пример того, как это могло быть сделано :

суперкласса (Point2D.java):

package test_superArg; 

public class Point2D { 
    private float x; 
    private float y; 

    public Point2D(float x, float y) { 
     this.x = x; 
     this.y = y; 
     System.out.println("Parent class constructor:"); 
     System.out.println("X = " + this.x + ", Y = " + this.y); 
    } 
    public float getX() {return x;} 
    public float getY() {return y;} 
    public void setX(float x) {this.x = x;} 
    public void setY(float y) {this.y = y;} 
} 

Подкласс (Point3D.java):

package test_superArg; 

public class Point3D extends Point2D { 
    private float z; 

    public Point3D(Point2D point2d, float z) { 
     super(point2d.getX(), point2d.getY()); // must be the 1st statement in a constructor 
     System.out.println("After calling super()"); 
     this.z = z; 
     System.out.println("Child class constructor:"); 
     System.out.println("X = " + getX() + ", Y = " + getY() + ", Z = " + this.z); 
    } 
    public float getZ() {return z;} 
} 

Основной класс (Start.java):

package test_superArg; 

public class Start { 

    public static void main(String[] args) { 
     System.out.println("Creating parent type class object..."); 
     Point2D point2d = new Point2D(2.0f, 4.0f); 
     System.out.println("Creating child type class object..."); 
     Point3D point3d = new Point3D(point2d, 8.0f); 
     System.out.println("Changing child class type object..."); 
     point3d.setX(10.0f); 
     point3d.setY(20.0f); 
     System.out.println("Parent type class object:"); 
     System.out.println("X = " + point2d.getX() + ", Y = " + point2d.getY()); 
     System.out.println("Child type class object:"); 
     System.out.print("X = " + point3d.getX() + ", Y = " + point3d.getY()); 
     System.out.println(", Z = " + point3d.getZ()); 
    } 
} 

Выход:

Creating parent type class object... 
Parent class constructor: 
X = 2.0, Y = 4.0 
Creating child type class object... 
Parent class constructor: 
X = 2.0, Y = 4.0 
After calling super() 
Child class constructor: 
X = 2.0, Y = 4.0, Z = 8.0 
Changing child class type object... 
Parent type class object: 
X = 2.0, Y = 4.0 
Child type class object: 
X = 10.0, Y = 20.0, Z = 8.0 
0

Как уже указывал Джон Скит, вам придется использовать супер в конструкторе подкласса (Java-компилятор заставит вас это делать, пока не определено конструктор по умолчанию). То, что нужно пройти, как супер-параметры, зависит от вас.

Предполагаю, что ваш mysupclass - это точка, а mysubclass - это прямоугольник. В качестве поведения по умолчанию вы можете использовать первую точку как ту, которая будет инициализировать mysupclass.

public class mysubclass extends mysupclass { 
    public mysubclass (mysupclass a, mysupclass b) { 
     super(a.getX(), a.getY()); 
     this.x2 = b.getX(); 
     this.y2 = b.getY(); 
     // anything else... 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^