C# 消息传递问题

C# 消息传递问题,c#,C#,我在OOP的第二周,我们的导师给了我一个传递消息的练习,我有一个错误,我似乎无法解决。错误是: 面向对象的光盘电影库。MOVIE“”未实现继承的抽象成员“面向对象的光盘电影库。brookcopy()” 这反过来又导致了随后的错误: Obj_-oriented_CD_MOVIE_Library.MOVIE.borrowCopy(Obj_-oriented_CD_MOVIE_Library.Student)∶找不到合适的方法重写 我不确定我的解释是否正确,这是代码 abstract class It

我在OOP的第二周,我们的导师给了我一个传递消息的练习,我有一个错误,我似乎无法解决。错误是:

面向对象的光盘电影库。MOVIE“”未实现继承的抽象成员“面向对象的光盘电影库。brookcopy()”

这反过来又导致了随后的错误:

Obj_-oriented_CD_MOVIE_Library.MOVIE.borrowCopy(Obj_-oriented_CD_MOVIE_Library.Student)∶找不到合适的方法重写

我不确定我的解释是否正确,这是代码

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");
      }
  }
}

请提供建设性的批评和帮助。

您似乎没有正确地覆盖副本。我们需要查看商品代码,但您提供的签名:

void borrowCopy(Student objStudent)
…与项中抽象方法的签名不同

从错误中可以看出,项中的方法没有任何参数

因此,您会遇到两个错误,首先,您没有提供具有所需签名的borrowCopy实现,其次,您使用override关键字表示项上不存在的签名

试试这个:

    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");
        }
    }

您似乎不正确地覆盖了该副本。我们需要查看商品代码,但您提供的签名:

void borrowCopy(Student objStudent)
…与项中抽象方法的签名不同

从错误中可以看出,项中的方法没有任何参数

因此,您会遇到两个错误,首先,您没有提供具有所需签名的borrowCopy实现,其次,您使用override关键字表示项上不存在的签名

试试这个:

    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");
        }
    }

你要的是细节,给你。这是你需要改变的东西。更新的
学生
课程:

//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);
   }
}
注意,我已经删除了
抽象类的继承,这里的
学生
不是
(假设我们谈论的是人类学生,我要求您提出可以“借用”学生副本的情况)。我可以看到您在这里需要一些其他类字段,比如名称值(稍后我会回来讨论)

然后,
更新了两个方法签名:

public abstract void borrowCopy(Student objStudent);

public abstract void returnCopy(Student objStudent);

然后,当您调用
movie.followcopy(this)时
学生
中,您将不会得到任何错误,并且可以从该方法中使用
学生
中的任何方法或属性。如果您在
Student
中添加了
Name
属性,您可以修改
Console.Writeline
borrowCopy()
中,将其更新为“Joe Blow,请参阅电影返回日期收据”,方法如下:
Console.Write(“{0},请参阅电影返回日期收据,\n”,Student.Name)

您询问了详细信息,给您。这是你需要改变的东西。更新的
学生
课程:

//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);
   }
}
注意,我已经删除了
抽象类的继承,这里的
学生
不是
(假设我们谈论的是人类学生,我要求您提出可以“借用”学生副本的情况)。我可以看到您在这里需要一些其他类字段,比如名称值(稍后我会回来讨论)

然后,
更新了两个方法签名:

public abstract void borrowCopy(Student objStudent);

public abstract void returnCopy(Student objStudent);

然后,当您调用
movie.followcopy(this)时
学生
中,您将不会得到任何错误,并且可以从该方法中使用
学生
中的任何方法或属性。如果您在
Student
中添加了
Name
属性,您可以修改
Console.Writeline
borrowCopy()
中,将其更新为“Joe Blow,请参阅电影返回日期收据”,方法如下:
Console.Write(“{0},请参阅电影返回日期收据,\n”,Student.Name)

@JamesGaunt是正确的,您要么需要更新
项的签名
以包含
学生
参数,要么将该参数从
电影
实现中删除。您或James能给我一个它应该是什么样子的示例吗?我是一个视觉学习者,一旦我看到它在代码中的外观,我就会更好地理解它。拿着你所拥有的,从
Movie
中的
borrowCopy()
中删除
Student objStudent
,它就会工作。从你发布的内容来看,你甚至没有在方法中使用
Student
对象。我已经在原始帖子中更新了我的学生代码,我没有收到方法'brookcopy'接受一个参数的重载。对于电影和CD,顺便问一下,为什么学生是一个项目?我认为这里需要考虑一些基本的OOP设计问题。我理解这当然是一个教训,但如果设计是合乎逻辑的,代码将更容易理解。在OOP术语中,学生和项目之间的关系应该是has-a关系,而不是is-a关系。如果学生可以取出多个项目,则可能一个学生有多个项目。@JamesGaunt是正确的,您需要更新
Item
的签名以包含
Student
参数,或者从
电影
借阅拷贝
的实现中去掉这个论点。你或詹姆斯能给我一个它应该是什么样子的例子吗?我是一个视觉学习者,一旦我看到它在代码中的外观,我就会更好地理解它。拿着你所拥有的,从
Movie
中的
borrowCopy()
中删除
Student objStudent
,它就会工作。从你发布的内容来看,你甚至没有在方法中使用
Student
对象。我已经在原始帖子中更新了我的学生代码,我没有收到方法'brookcopy'接受一个参数的重载。对于电影和CD,顺便问一下,为什么学生是一个项目?我认为有一些基金会