c# - 如何在从抽象类派生的类中创建新方法?

标签 c# oop inheritance polymorphism abstract-class

在下面的示例中,我使用的是 C#。

我创建了一个抽象类 Base_Collection,然后我从它派生了其他类(BookMovieGame)。但是,我不知道如何在不出现编译器错误的情况下添加可用于那些新子类的新方法。

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

最佳答案

您可以毫无问题地向基类添加方法。您收到编译器错误的原因是您错误地使用了 override 关键字。

为了使用 override 关键字,方法名和签名必须与父类中的方法名和签名匹配,并且方法必须标记为 virtualabstract 在基类中。两者区别解答here .

既然书、电影和电影都可以“表演”,你可能要考虑这样安排你的类(class):

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 }
}

关于c# - 如何在从抽象类派生的类中创建新方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783362/

相关文章:

java - 使用构造函数重载和带有继承的预先存在的静态对象

java - 具有抽象泛型和集合的 JPA 单表继承

c# - 从非 guid 格式的字符串生成 GUID

java - 简单的 UML OOP 风格的软件规划工具?

objective-c - 声明 Objective C 对象时哪个更有效

oop - 如何在 UML 中正确建模 MVC 类图?

javascript - 如何将函数从主对象动态继承到其他对象?

c# - 如何阻止自定义性能计数器实例名称自动转换为小写

c# - 为多个项目设置独立的 COM

c# - 在 MVC 中清除 View 引擎会破坏站点地图面包屑样式