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