2013-03-30 3 views
0

Компилятор дает мне сообщение об ошибке, в котором говорится, что он не может найти фильмы [x] .getTitle() и фильмы [x] .getYear. Я интересно, если это проблема с выходом через интерфейс, чтобы добраться до классовCant find Symbol error

Здесь ошибка:

MathewBorumP5.java:68: error: cannot find symbol 
System.out.printf("%-26s%-6s%-10s%-9s%-11s\n", movies[x] 
.getTitle(), 

^ 
symbol: method getTitle() 
location: interface Profitable 
MathewBorumP5.java:69: error: cannot find symbol 
          movies[x].getYear(), movies[x].calcRevenue(), 
            ^
symbol: method getYear() 
location: interface Profitable 
2 errors 

Вот мой клиент класса:

import java.util.Scanner; 

public class MathewBorumP5 { 
    public static void main(String[] args) { 
     int choice; 
     boolean restart = true; 

     Scanner input = new Scanner(System.in); 

     Profitable[] movies = new Profitable[6]; 
     movies[0] = new Animated("Beauty and the Beast", "Gary Trousdale", 1991, 
     10.0, 5.0, 2.0); 
     movies[1] = new Animated("Peter Pan", "Clyde Geronimi", 1953, 2.0, 1.2, 
     .5); 
     movies[2] = new Documentary("Planet Earth", "Alastair Fothergill", 2006, 
     10, 20, 5); 
    movies[3] = new Documentary("Drain the Ocean", "Steve Nichols", 2009, 9, 
     2,3); 
    movies[4] = new Drama("The Shawshank Redemption", "Frank Darabont", 
     1994, 89, 7, 2); 
    movies[5] = new Drama("The Godfather", "Francis Coppola", 1972, 10, 3, 
     5); 

    do { 
     menu(); 
     System.out.print("Enter a number from 1 - 5: "); 
     choice = input.nextInt(); 
     System.out.print("\n"); 

     switch(choice) { 
      case 1: 
       item1(movies); 
       break; 
      case 2: 
       break; 
      case 3: 
       break; 
      case 4: 
       break; 
      case 5: 
       restart = false; 
       break; 
      default: 
       System.out.print("You didn't enter a number between 1" 
        + " and 5.\n"); 
       break; 
     } 
    } while(restart == true); 
} 

public static void menu() { 
    System.out.print("Warren Moore Movie Menu\n"); 
    System.out.print("1. Show the list of movies in the array\n"); 
    System.out.print("2. Display the total number of movies and the total" + 
     " revenues\n"); 
    System.out.print("3. Search movie by title\n"); 
    System.out.print("4. Display movies sorted by profit in decreasing" + 
     " order\n"); 
    System.out.print("5. Exit\n"); 
} 

public static void item1(Profitable[] movies) { 
    double revenue; 
    System.out.printf("%-26s%-6s%-10s%-9s%-11s\n", "Title", "Year", 
    "Revenue", "Profit", "Category"); 
    for(int x = 0; x <= 6; x++) { 
     revenue = movies[x].calcRevenue(); 
     System.out.printf("%-26s%-6s%-10s%-9s%-11s\n", movies[x].getTitle(), 
      movies[x].getYear(), movies[x].calcRevenue(), 
      movies[x].calcProfit(revenue), movies[x].category()); 
    } 
} 
} 

Вот мой суперкласс:

public class Movie implements Profitable { 
protected String title; 
protected String director; 
protected int year; 
protected double productionCost; 
private int totalMovies = 0; 

public Movie() { 
    totalMovies++; 
} 
public Movie(String newTitle, String newDirector, int newYear, 
    double newCost) { 
    totalMovies++; 
    title = newTitle; 
    director = newDirector; 
    year = newYear; 
    productionCost = newCost; 
} 

public int getTotalMovies() { 
    return totalMovies; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String newTitle) { 
    this.title = title; 
} 

public String getDirector() { 
    return director; 
} 

public void setDirector(String director) { 
    this.director = director; 
} 

public int getYear() { 
    return year; 
} 

public void setYear(int year) { 
    this.year = year; 
} 

public double getProductionCost() { 
    return productionCost; 
} 

public void setProductionCost(double productionCost) { 
    this.productionCost = productionCost; 
} 

public String toString() { 
    return ""; 
} 
} 

Вот мои отдельные классы. публичный класс Анимация продолжается Кинофильмы выгодные { частная двойная ставка; частный доход;

public Animated() { 
    super(); 
} 

public Animated(String title, String director, int year, double cost, 
    double rate, double income) { 
    super(title, director, year, cost); 
    this.rate = rate; 
    this.income = income; 
} 

public double getRate() { 
    return rate; 
} 

public void setRate(double rate) { 
    this.rate = rate; 
} 

public double getIncome() { 
    return income; 
} 

public void setIncome(double income) { 
    this.income = income; 
} 

public String category() { 
    return "Animated"; 
} 

public double calcRevenue() { 
    return (income * rate); 
} 

public double calcProfit(double revenue) { 
    return (revenue - super.productionCost); 
} 

public String toString() { 
    return (super.toString() + ""); 
} 
} 

Номер 2

public class Documentary extends Movie implements Profitable { 
private int distributors; 
private double premium; 

public Documentary() { 
    super(); 
} 

public Documentary(String title, String director, int year, double cost, 
    int distributors, double premium) { 
    super(title, director, year, cost); 
    this.distributors = distributors; 
    this.premium = premium; 
} 

public int getDistributors() { 
    return distributors; 
} 

public void setDistributors(int distributors) { 
    this.distributors = distributors; 
} 

public double getPremium() { 
    return premium; 
} 

public void setPremium(double premium) { 
    this.premium = premium; 
} 

public String category() { 
    return "Documentary"; 
} 

public double calcRevenue() { 
    return (distributors * premium); 
} 

public double calcProfit(double revenue) { 
    return (revenue - super.productionCost); 
} 

public String toString() { 
    return (super.toString() + ""); 
} 
} 

Номер 3

public class Drama extends Movie implements Profitable { 
private int tickets; 
private double avgPrice; 

public Drama() { 
    super(); 
} 

public Drama(String title, String director, int year, double cost, 
    int tickets, double avgPrice) { 
    super(title, director, year, cost); 
    this.tickets = tickets; 
    this.avgPrice = avgPrice; 
} 

public int getTickets() { 
    return tickets; 
} 

public void setTickets(int tickets) { 
    this.tickets = tickets; 
} 

public String category() { 
    return "Drama"; 
} 

public double calcRevenue() { 
    return (tickets * avgPrice); 
} 

public double calcProfit(double revenue) { 
    return (revenue - super.productionCost); 
} 

public String toString() { 
    return (super.toString() + ""); 
} 
} 

И, наконец, мой интерфейс.

public interface Profitable { 
    public abstract String category(); 
    public abstract double calcRevenue(); 
    public abstract double calcProfit(double revenue); 
} 

ответ

1

Доходный интерфейс не имеет методов, которые вы пытаетесь вызвать, и поэтому компилятор правильно жаловаться на это вам. Переменная массива не знает, какой тип объекта может содержать элемент массива, и на самом деле можно было бы хранить один тип элемента только для его изменения позже, поэтому для компилятора имеет смысл вести себя таким образом. Клюд должен был проверить каждый элемент, хранящийся в массиве, чтобы узнать, какой тип он на самом деле есть, скажем, с помощью instanceof, но это очень хрупкое решение и не рекомендуется. Safest должен только вызывать Доходные методы в Доходных элементах массива и попытаться использовать магию полиморфизма, чтобы каждый объект мог выполнять разные поведения для одного и того же вызова метода.

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

+0

Спасибо, поэтому я должен использовать «Movie [] movies = new Movie [6];» вместо? – mattersonline

+0

@ user2226282: Если все содержимое массива будет дочерним объектом Movie или Movie, тогда да, попробуйте. –

+0

Я сделал это, но теперь он не может найти calcRevenue, calcProfit или категорию. Он распознает только методы в суперклассе. – mattersonline

0

Вы правы, проблема связана с вашим прибыльным интерфейсом. Когда вы создаете элемент массива (прибыльные [] фильмы), это означает, что вам доступны только методы, определенные в этом интерфейсе.

Массив объектов фильма, вероятно, вы здесь. Все эти объекты появляются, расширяя Movie и реализуя Profitable, поэтому вы сможете получить доступ ко всему этому.