Java создает конструктор в подклассе с суперклассом в качестве аргументов

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


person Spyros    schedule 05.02.2012    source источник


Ответы (7)


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

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

person Jon Skeet    schedule 05.02.2012
comment
Привет и спасибо за ответ. Любые советы о том, что я должен использовать в качестве супер? общественный мойподкласс (мойподкласс а, мойподкласс б) {супер(а,б); } она не будет работать :( - person Spyros; 05.02.2012
comment
@Spyros: Нет, потому что объявлено, что суперконструктор принимает два значения int, и вы пытаетесь передать два значения mysupclass. Мы понятия не имеем, что эти классы (или параметры конструктора в любом классе) должны представлять, поэтому я не могу предложить значения. - person Jon Skeet; 05.02.2012
comment
Еще раз спасибо за ответ. Если mysupclass - это пара int, то mysubclass - это 2 per int, поэтому a и b могут быть как (0,0) или (1,2) и т. д. Помогает ли это? - person Spyros; 05.02.2012
comment
@Spyros: Нет, это не так, потому что 2 пары целых чисел не являются парой целых чисел, поэтому ваша иерархия наследования была бы неуместной. Вы вообще уверены, что у вас должны быть эти отношения наследования? Можешь ли ты действительно думать об экземпляре своего подкласса как об экземпляре своего суперкласса? - person Jon Skeet; 05.02.2012
comment
Ну да. Что мы хотим сделать с этим: суперкласс принимает 2 целых числа, чтобы указать точку. подкласс занимает 2 суперкласса (2 балла), чтобы указать прямоугольник. - person Spyros; 05.02.2012
comment
@Spyros: Это определенно не похоже на хорошие отношения подкласса. Прямоугольник не является точкой. Вместо этого прямоугольник может составлять две точки. - person Jon Skeet; 05.02.2012
comment
Может быть, я был недостаточно конкретен. Две точки подкласса должны быть верхней левой и нижней правой точками прямоугольника. Также это не зависит от меня. Меня просят сделать это так. :) - person Spyros; 05.02.2012
comment
@Spyros: Вы были достаточно конкретны, но это все еще ужасное место для применения наследования, и вы должны сказать тому, кто попросил вас сделать это, что это просто плохая идея. Точка не является прямоугольником. Вы уверены, что они специально сказали использовать наследование? Если это академическое упражнение, и вы точно представили его, это поднимает серьезные вопросы о компетентности человека, который просит вас это сделать. - person Jon Skeet; 05.02.2012
comment
Привет, Джон. Да, это для сочинения. Так что это что-то вроде демонстрации знаний. Я нашел способ заставить его работать. public mysubclass (supclass u, supclass d) { super(u.getX(), u.getY()); ... и я получаю d.getX() и d.getY() . getX() и getY() — общедоступные методы суперкласса. Конечно, это не значит, что вы должны делать это в продакшене. - person Spyros; 06.02.2012
comment
@Spyros: Тебе вообще никогда не следует этого делать. Столь же важно отказаться от Integer.MAX_VALUE и Integer.MIN_VALUE, если они не предназначены для того, чтобы делать что-то полезное... - person Jon Skeet; 06.02.2012

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

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

person Bohemian♦    schedule 05.02.2012
comment
Суперкласс не знает о подклассе — посмотрите на текст mysupclass; он не упоминает мой подкласс. - person Jon Skeet; 05.02.2012
comment
Честно говоря, Джон прав. Я никому не говорил о подклассе :) Спасибо за ответ. - person Spyros; 05.02.2012

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

person Galaxin    schedule 06.02.2012

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

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

Суперкласс:

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
    }
}
person Saurabh Nailwal    schedule 21.08.2015

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

Суперкласс (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
person Chupo_cro    schedule 14.07.2016

Как уже указывал Джон Скит, вам придется использовать super в конструкторе подкласса (компилятор 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...
    }
}
person Unobic    schedule 30.07.2016

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

класс поддержки:

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
    }
}
person Popeye    schedule 05.02.2012