Java создать конструктор в подклассе с суперклассом в качестве аргументов - PullRequest
2 голосов
/ 05 февраля 2012

Я хочу сделать что-то подобное в 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 в качестве аргументов для моего конструктора подкласса? Должен ли я использовать super в конструкторе подкласса и что я должен добавить в super?

Заранее спасибо!

Ответы [ 7 ]

1 голос
/ 05 февраля 2012

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

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

0 голосов
/ 30 июля 2016

Как уже говорил Джон Скит, вам придется использовать super в конструкторе подкласса (компилятор Java заставит вас делать это, пока не определен конструктор по умолчанию). Что передать в качестве суперпараметров, решать вам.

Я предполагаю, что ваш класс mysup является точкой, а класс mysub - прямоугольником. В качестве поведения по умолчанию вы можете использовать первую точку в качестве точки инициализации 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...
    }
}
0 голосов
/ 15 июля 2016

Вот пример, как это можно сделать:

Суперкласс (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 голосов
/ 21 августа 2015

Справка для вас: как наследовать конструктор от суперкласса до подкласса

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

Суперкласс:

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 голосов
/ 06 февраля 2012

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

0 голосов
/ 05 февраля 2012

Возможно, вы захотите добавить конструктор по умолчанию, так как общая практика кодирования говорит, что если вы перегружаете конструктор по умолчанию, то вам следует добавить его обратно в себя. Возможно, вы захотите немного изучить конструкторы 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 голосов
/ 05 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...