2016-07-24 2 views
-1

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

Итак, в этом примере родительский класс (для общего назначения можно назвать классом Car) и дочерним классом (класс RedCar). Родительский класс, который является абстрактным, содержит расстояние атрибута и содержит метод computeVelocity, который принимает входное значение аргумента (double) и возвращает двойное значение расстояния, деленное на время (таким образом давая скорость).

У дочернего класса есть конструктор RedCar (double inputDistance). Он также должен иметь доступ к методу computeVelocity, не переопределяя его.

Вот где проблема. Логично, я понимаю, что computeVelocity не должен принимать переменную inputDistance из RedCar, потому что она вызывает метод другого класса. Однако я хочу знать, как привести этот метод в класс RedCar, чтобы он мог использоваться в указанном классе с аргументами, переданными конструктору.

Вот пример кода

//Car Class 
public abstract class Car{ 
    //abstract variable 
    private double distance; 
    //compute velocity method 
    public double computeVelocity(double time){ 
    return distance/time; 
    } 
} 




//RedCar Class 
public class RedCar extends Car{ 
    public double distance; 

    public RedCar (double inputDistance){ 
     this.distance = inputDistance; 
    } 
    //This is currently my method but I believe this already constitutes as overridding 
    public double computeVelocity(double hours){ 
     Car.super.computeVelocity(hours); 
    } 
} 
+0

Это не совсем ясно для меня, что вы пытаетесь сделать здесь, или почему метод должен быть переопределен на всех. Поскольку переопределение ничего не добавляет, зачем вообще это делать? Почему бы просто не использовать метод «computeVelocity» базового класса? – David

+1

В подклассе не должно быть второго поля расстояния. Поле расстояния базового класса, кстати, всегда равно 0. Просто у меня есть защищенный конструктор в базовом классе, принимающий расстояние в качестве аргумента, и вызываем его (используя 'super (distance)') из конструктора подкласса. –

ответ

0

Как указано в некоторых комментариях к вам ответ, вы на самом деле не нужно, и не должно быть расстояние в два раза (один раз в родительском классе и один раз в дочернем классе). Используйте параметр distance из родительского класса, и нет причин переопределять ваш метод. Вы можете вызвать метод родительского класса, используя ключевое слово super.

Надеюсь, это поможет.

0

Поскольку переменная частного экземпляра наследуется в подклассе, но недоступна в подклассе (вы можете использовать отражение для доступа к нему). У вас есть два способа предоставить ценность в двоичной дистанции переменной экземпляра Car, предоставляя общедоступный метод setter или getter или предоставляющий защищенный или публичный конструктор и вызывающий этот конструктор из подкласса.

увидеть ссылку Do subclasses inherit private fields? INHERIT-частного-полей

конструктору суперкласса, которые устанавливают значение в частном переменном расстоянии, так как частный элемент доступен только на есть собственный член означает их собственный метод и конструктор.

protected Car(double distance){ 
    this.distance = distance; 
    } 

А также у вас нет необходимости определять переменные расстояния снова в подклассе, потому что вы не используете его в методе computeVelocity (подкласс). Поскольку метод подкласса вызывает метод суперкласса, а метод суперкласса использует собственное частное двойное расстояние. Поэтому ваша переменная расстояния определяется в подклассе, не используемом методом суперкласса.

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

 public RedCar(double inputDistance) { 
    super(inputDistance); 

     } 

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

public double computeVelocity(double hours) { 
     return super.computeVelocity(hours); 
    } 
0

RedCar Ваш класс наследует класс Car. Итак, Car - это не просто другой класс. Если вы создаете экземпляр RedCar, все части Car также доступны. A RedCarявляетсяCar.

В вашем решении вы создали поле distance как в суперклассе, так и в подклассе. На самом деле у вас есть два поля с именем distance в каждом экземпляре RedCar.

Приходит во внимание. Хотя частная переменная distance является частью RedCar, это видно только в классе Car. Если только методы, определенные в Car, нуждаются в доступе distance, нет необходимости изменять видимость. Но вам нужен способ установить distance. Если значение не изменяется со временем, вы должны включить конструктор в класс Car.

Видимость метода computeVelocity(), определенная в Car, является общедоступной, поэтому нет необходимости повторять ее в подклассе. Потому что RedCar является Car, вы можете позвонить computeVelocity() на каждый экземпляр RedCar.

public abstract class Car{ 
    private double distance; 

    // Constructor with visibility protected. 
    // So it is visible in each subclass and must be 
    // called by each subclass constructor. 
    // Btw.: It is common practice to use the same name 
    // for input parameters as for fields. The field 
    // variable can be accessed with the "this" keyword. 
    protected Car(double distance) { 
    this.distance = distance; 
    } 

    //compute velocity method 
    public double computeVelocity(double time){ 
    return distance/time; 
    } 
} 


public class RedCar extends Car{ 
    public double distance; 

    public RedCar (double distance){ 
    // Call the Car constructor 
    super(distance) 
    } 

    // No need to repeat the definition of 
    // computeVelocity unless you want to redefine 
    // the behaviour.. 
} 

Тогда при создании RedCar экземпляра:

RedCar redCar = new RedCar(100.0); 

первый в RedCar вызывается конструктор, который затем вызывает Car конструктор, который устанавливает distance поле для 100.0.

Вы можете вызвать метод:

double velocity = redCar.computeVelocity(60.0);