如何在派生自抽象类的类中创建新方法?
在以下示例中,我使用的是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);
}
}
}
除了@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();
}
}
您可以毫无问题地将方法添加到基类中。 你得到编译器错误的原因是你错误地使用了override
关键字。
为了使用override
关键字,方法名称和签名必须与父类中的方法名称和签名匹配,并且方法必须在基类中标记为virtual
或abstract
。 两者之间的区别在这里得到解答。
既然书,电影和电影都可以“表演”,你可能想考虑让你的课如下:
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 }
}
Base_Collection
没有名为Read_Book
的方法。 要调用派生类的方法,您需要将例如
(Book)book.Read_Book();
链接地址: http://www.djcxy.com/p/38123.html
上一篇: How to create new methods in classes derived from an abstract class?