2014-02-04 3 views
1

Я нахожусь на своей второй неделе ООП, наш преподаватель дал упражнение для передачи сообщений, у меня ошибка, которую я не могу решить. Ошибка:Сообщение об ошибке

Obj_Orientated_CD_MOVIE_Library.Movie' does not implement inherited abstract member 'Obj_Orientated_CD_MOVIE_Library.borrowCopy()'

, который, в свою очередь, привело к последующей ошибке:

Obj_Orientated_CD_MOVIE_Library.Movie.borrowCopy(Obj_Orientated_CD_MOVIE_Library.Student)': no suitable method found to override

Я не уверен, если я объяснил это правильно, вот код.

abstract class Item 
{ 
    protected int copies; 
    protected int availCopies; 
    protected string title; 

    public Item(string newTitle, int newCopies, int newAvailCopies) 
    { 
     title = newTitle; 
     copies = newCopies; 
     availCopies = newAvailCopies; 
    } 

    public abstract void borrowCopy(Student objStudent); 

    public abstract void returnCopy(); 

    public int Copies 
    { 
     get 
     { 
      return copies; 
     } 
     set 
     { 
      copies = value; 
     } 
    } 

    public int AvailCopies 
    { 
     get 
     { 
      return availCopies; 
     } 
     set 
     { 
      availCopies = value; 
     } 
    } 

    public string Title 
    { 
     get 
     { 
      return title; 
     } 
     set 
     { 
      title = value; 
     } 
    } 
} 


class Student 
{ 
    public string date; 
    public string returnDate; 

    public Student(string newDate, string newReturnDate, string newTitle, int newCopies, int newAvailCopies) 
     : base(newTitle, newCopies, newAvailCopies) 
    { 
     date = newDate; 
     returnDate = newReturnDate; 
    } 
    public void borrowMovie(Movie objMovie) 
    { 
     objMovie.borrowCopy(this); 
    } 
    public void borrowCD(CD objCD) 
    { 
     objCD.borrowCopy(this); 
    } 
    public override void borrowCopy(Student objStudent) 
    { 
    } 
    public override void returnCopy() 
    { 
    } 
} 

class Movie : Item 
{ 
    public string runTime; 

    public Movie(string newTitle, string newRunTime, int newCopies, int newAvailCopies) 
     : base(newTitle, newCopies, newAvailCopies) 
    { 
     runTime = newRunTime; 
    } 
    public string Runtime 
    { 
     get 
     { 
      return runTime; 
     } 
     set 
     { 
      runTime = value; 
     } 
    } 
    public override void returnCopy() 
    { 
     availCopies++; 
     Console.Write("\nThank you for returning the Movie\n"); 
    } 
    public override void borrowCopy(Student objStudent) 
    { 
     if (AvailCopies > 0) 
     { 
      AvailCopies--; 
      Console.Write("Please refer to receipt for return date of the Movie\n"); 
     } 
     else 
     { 
      Console.WriteLine("\nThis Movie is not available at this time, please try again later"); 
     } 
    } 
} 

class CD : Item 
{ 
    public string band; 

    public CD(string newTitle, string newBand, int newCopies, int newAvailCopies) 
     : base(newTitle, newCopies, newAvailCopies) 
    { 
     band = newBand; 
    } 
    public string Band 
    { 
     get 
     { 
      return band; 
     } 
     set 
     { 
      band = value; 
     } 
    } 
    public override void returnCopy() 
    { 
     availCopies++; 
     Console.Write("\nThank you for returning the CD\n"); 
    } 
    public override void borrowCopy(Student objStudent) 
    { 
     if (AvailCopies > 0) 
     { 
      AvailCopies--; 
      Console.Write("Please refer to receipt for return date of the CD\n"); 
     } 
     else 
     { 
      Console.WriteLine("\nThis CD is not available at this time, please try again later"); 
     } 
    } 
} 

Конструктивная критика и помощь пожалуйста.

+0

@JamesGaunt правильно, вы либо необходимо обновить подпись 'Item', чтобы включить аргумент' Student', или вырезать этот аргумент из 'Movie' реализации' loanCopy'. –

+0

Не могли бы вы или Джеймс дать мне пример того, как он должен выглядеть? Я - визуальный ученик, когда я вижу, как он выглядит в коде, я понимаю это лучше. –

+0

Возьмите то, что у вас есть, удалите 'Student objStudent' из' loanCopy() 'в' Movie', и он будет работать. Из того, что вы опубликовали, вы даже не используете этот объект «Студент» в методе. –

ответ

1

Вы просили детали, здесь вы идете. Вот что вам нужно изменить. Обновленный Student класс:

//is a Student an Item? I think not 
class Student 
{ 
    public string date; 
    public string returnDate; 

    public Student(string newDate, string newReturnDate) 
    { 
     date = newDate; 
     returnDate = newReturnDate; 
    } 
    public void borrowMovie(Movie objMovie) 
    { 
     objMovie.borrowCopy(this); 
    } 
    public void borrowCD(CD objCD) 
    { 
     objCD.borrowCopy(this); 
    } 
} 

Обратите внимание, я удалил наследование Item абстрактного класса здесь, Student не является Item (я призываю вас, чтобы придумать обстоятельства, при которых вы можете «заимствовать» копию студент, предполагая, что мы говорим о человеческих учениках). Я мог видеть, что вам нужны другие поля классов, такие как значение имени (я вернусь к этому позже).

Затем Item имеет две сигнатуры метода Изменено:

public abstract void borrowCopy(Student objStudent); 

public abstract void returnCopy(Student objStudent); 

Затем, когда вы звоните movie.borrowCopy(this); изнутри Student, вы не получите каких-либо ошибок, и может использовать любые методы или свойства в Student изнутри, что метод. Если вы добавили Name недвижимости в Student, вы можете изменить ваш Console.Writeline в borrowCopy() сказать «Джо Blow, пожалуйста, обратитесь к квитанции на дату возвращения в кино», обновляя его, как это: Console.Write("{0}, please refer to receipt for return date of the Movie\n", student.Name);

+0

Фантастично, я удалил Inheritance и изменил его так же, как вы показали, и он работает правильно, большое вам спасибо за это, потому что он в коде дал мне то, что мне было нужно, уровень понимания того, зачем мне это нужно там, абсолютная сдержанность. –

+0

Я пытаюсь добавить это имя в Консоль кинозаписей loanCopy (Student objStudent), однако, когда я нажимаю точку, у меня нет опции для имени внутри Intellisense. –

+0

Я исправил его, я пытался использовать экземпляр Student вместо objStudent. –

3

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

void borrowCopy(Student objStudent) 

... это не то же самое, как подписи абстрактного метода в п.

Из-за ошибки, кажется, метод в Элементе не имеет параметров.

Итак, вы получаете две ошибки: во-первых, вы не предоставляете реализацию loanCopy с необходимой подписью, а во-вторых, вы используете ключевое слово переопределения для подписи, которая не существует на Item.

Попробуйте это:

public override void borrowCopy() 
    { 
     if (AvailCopies > 0) 
     { 
      AvailCopies--; 
      Console.Write("Please refer to receipt for return date of the Movie\n"); 
     } 
     else 
     { 
      Console.WriteLine("\nThis Movie is not available at this time, please try again later"); 
     } 
    } 
+0

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

+0

Это был мой первоначальный код, прежде чем мы должны были начать реализацию передачи сообщений, мне нужно ввести в него фильм objMovie и Student objStudent. –

+0

Но вы не используете Student в методе. Если вам нужно это в методе, вам нужно изменить подпись loanCopy в Item, чтобы она соответствовала вашему новому коду (например, включить параметр Student). Подписи заимствования Копи в Item и Movie должны быть одинаковыми. –

Смежные вопросы