Абстрактная проблема типа данных - PullRequest
1 голос
/ 02 ноября 2011

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

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

import javax.swing.*;

public abstract class MenuItem{

    private String itemName;
    private int ct;
    private double costPer;

    public String getItemName()
    {
        return itemName;
    }

    public int getCt()
    {
        return ct;
    }

    public double getCostPer()
    {
        return costPer;
    }
}

public class Hamburger extends MenuItem{

    itemName = "Hamburger";
    ct = 0;
    costPer = 4.99;
}  

Я знаю, что это неправильно, но кто-то может сказать мне, почему? Гамбургер подкласса наследует только методы или как?

Ответы [ 7 ]

2 голосов
/ 02 ноября 2011

Есть несколько вопросов:

  1. itemName и др. private, поэтому, хотя они наследуются , они не видимы для подкласса.
  2. Синтаксис, который вы используете в Hamburger, недействителен.

Вот как вы можете исправить свой код:

public abstract class MenuItem{

  public MenuItem(String itemName, int ct, double costPer) {
    this.itemName = itemName;
    this.ct = ct;
    this.costPer = costPer;
  }
  ...
}

public class Hamburger extends MenuItem{

  public Hamburger() {
    super("Hamburger", 0, 4.99)
  }

}  

Наконец, я бы сказал, что вместо использования абстрактного базового класса и набора конкретных классов было бы лучше использовать один конкретный класс для MenuItem и сделать Hamburger и т. Д. экземпляров * 1022. * этого класса.

1 голос
/ 02 ноября 2011

Насколько я понимаю, подкласс наследует все методы и переменные от абстрактного, но я думаю, что я неправильно понимаю это

Да, ваше понимание неправильного понимания верно. : -)

Подклассы

в java не наследуют закрытые переменные-члены. они получают только публичных и защищенных членов.

1 голос
/ 02 ноября 2011

Проблема заключается в видимости полей в вашем MenuItem родительском классе.private видимость означает, что они невидимы для любого другого класса, включая собственные подклассы.

В oreder, чтобы сделать ваши поля видимыми для подклассов, вы должны изменить их видимость на protected.Имейте в виду, что это делает поля видимыми для всех классов в одном и том же пакете.

Все проблемы видимости memeber описаны более подробно в этой статье

0 голосов
/ 02 ноября 2011

Абстрактный класс никогда не может быть создан.Его единственная цель - продление.В абстрактном классе, если вы укажете хотя бы один метод как абстрактный, тогда весь класс должен быть указан как абстрактный.Абстрактный класс позволяет вам реализовывать и не реализовывать (абстрактные) методы в одном классе.Если все методы в классе являются абстрактными, то у вас фактически есть интерфейс, и любые переменные, объявленные в интерфейсе, рассматриваются как константы.Переменные в вашем вопросе не наследуются, поскольку они являются частными для абстрактного класса.Вы должны получить к ним доступ через методы абстрактного класса.

0 голосов
/ 02 ноября 2011

Да, Hamburger наследует только методы. Это потому что они публичные. Если вы сделаете их закрытыми (например, поля), они также не будут наследоваться. Вот как можно решить проблемы.

import javax.swing.*;

public abstract class MenuItem {

    //To be visible to subclasses, these need to be public, package-private, or protected
    protected String itemName;
    protected int ct;
    protected double costPer;

    public String getItemName() {
        return itemName;
    }

    public int getCt() {
        return ct;
    }

    public double getCostPer() {
        return costPer;
    }

}

public class Hamburger extends MenuItem {

    //These assignments need to be inside a block, like a constructor
    public Hamburger() {
        itemName = "Hamburger";
        ct = 0;
        costPer = 4.99;
    }

}  
0 голосов
/ 02 ноября 2011

Прежде чем вы начнете изучать абстрактные типы, начните с концепции инкапсуляции и постарайтесь понять ее, поскольку она (по мнению многих) считается наиболее важной концепцией объектно-ориентированного проектирования, за которой следует полиморфизм и наследование. Если члены класса являются частными, ни один из подклассов не сможет получить к ним прямой доступ.

0 голосов
/ 02 ноября 2011

itemName, costPer и ct объявлены как поля частного доступа .Они доступны только из класса, в котором они определены. Если вы объявите их с доступом protected, вы сможете получить к ним доступ.

Как определено в Спецификации языка Java, раздел 6.6 Контроль доступа

Член (класс, интерфейс, поле или метод) ссылки (класса, интерфейс или массив) или конструктор типа класса доступен только в том случае, если тип доступен, а член или конструктор объявлен для разрешения доступа:

  • ...
  • (В противном случае), если член или конструктор объявлен как закрытый, тогда доступ разрешается тогда и только тогда, когда он происходит в теле класса верхнего уровня (§7.6), в котором содержится объявление члена или конструктора.
  • ...
...