在以下示例中,我使用的是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);
}
}
}
答案 0 :(得分:3)
您可以毫无问题地向基类添加方法。您收到编译错误的原因是您错误地使用了override
关键字。
为了使用override
关键字,方法名称和签名必须与父类中的方法名称和签名匹配,并且方法必须标记为virtual
或abstract
基类。两者之间的差异得到回答here。
由于书籍,电影和电影都可以“#34;”,你可能需要考虑制作这样的课程:
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 }
}
答案 1 :(得分:2)
除了@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();
}
}
答案 2 :(得分:1)
Base_Collection
没有名为Read_Book
的方法。要在派生类上调用该方法,您需要转换例如。
(Book)book.Read_Book();
答案 3 :(得分:1)
您无法覆盖不存在的方法。删除override
然后在访问方法之前进行强制转换,就像Will提到的那样。
class Book : Base_Collection
{
public Book()
{
}
public void Read_Book()
{
}
}
public static void Main(string[] args)
{
Base_Collection book = new Book();
book.title = "The Dark Tower";
(Book)book.Read_Book();
...
}
但是,我只是创建一个Book对象,而不是强制转换它,否则你将不得不在程序中进行大量的转换。也许甚至可以重新考虑阶级等级,就像slugster提到的那样。
答案 4 :(得分:0)
您应该从public override void Read_Book()中删除override关键字,或者将此函数添加到Base_Collection,如下所示
public abstract void Read_Book();