在下面的示例中,我使用的是C#。
我创建了一个抽象类Base_Collection,然后从它派生了其他类(Book、Movie、Game)。但是,我不知道如何添加可用于这些新的子类的新方法而不出现编译器错误。
namespace polymorphism_test_01
{
abstract class Base_Collection
{
public int id = 0;
public string title = "";
public Base_Collection() { }
}
}
namespace polymorphism_test_01
{
class Book : Base_Collection
{
public Book() { }
public override void Read_Book() { }
}
}
namespace polymorphism_test_01
{
class Game : Base_Collection
{
public Game() { }
public void Play_Game() { }
}
}
namespace polymorphism_test_01
{
class Movie : Base_Collection
{
public Movie() { }
public void Watch_Movie() { }
}
}调用book.Read_Book()在下面的代码片段中不起作用,编译器将输出一个错误:
namespace polymorphism_test_01
{
class Program
{
public static void Main(string[] args)
{
Base_Collection book = new Book();
book.title = "The Dark Tower";
book.Read_Book();
Console.WriteLine(book.title);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}发布于 2012-12-09 08:32:16
根据@Will的回答(这是正确的),您可以更好地构建您的层级结构。例如,您对每种媒体类型执行不同的操作,但每种类型仍然会被使用。
因此,将基类更改为一个名为Consume()的抽象基方法,然后在每个派生类中重写并实际实现该方法,这样您就可以传递基类的实例,而无需在每个媒体类型上进行强制转换来调用Consume()方法:
public abstract class Base_Collection
{
public int id = 0;
public string title = "";
public Base_Collection() { }
public abstract void Consume();
}
public class Book : Base_Collection
{
public Book() { }
public override void Consume()
{
//do book reading stuff in here
}
}
public class Movie : Base_Collection
{
public Movie() { }
public override void Consume()
{
//do movie watching stuff in here
}
}
public class SomeOtherClass
{
public void SomeMethod(Base_Collection mediaItem)
{
//note that the book/movie/whatever was passed as the base type
mediaItem.Consume();
}
}发布于 2012-12-09 08:35:28
您可以将方法添加到基类,而不会出现任何问题。出现编译器错误的原因是您错误地使用了override关键字。
为了使用override关键字,方法名称和签名必须与父类中的方法名称和签名匹配,并且方法必须在基类中标记为virtual或abstract。这两者之间的区别在于here。
既然书、电影和电影都可以“表演”,你可以考虑让你的类像这样:
abstract class Base_Collection
{
public int id = 0;
public string title = "";
public Base_Collection() { }
public virtual void PerformAction() { } // or public virtual void PerformAction(){ }
}
class Book : Base_Collection
{
public Book() { }
public override void PerformAction() { // read book }
}
class Game : Base_Collection
{
public Game() { }
public override void PerformAction() { // play game }
}
class Movie : Base_Collection
{
public Movie() { }
public void PerformAction() { // watch movie }
}发布于 2012-12-09 08:24:18
Base_Collection没有名为Read_Book的方法。要调用派生类上的方法,需要强制转换,例如
(Book)book.Read_Book();https://stackoverflow.com/questions/13783362
复制相似问题