首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在从抽象类派生的类中创建新方法?

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

Stack Overflow用户
提问于 2012-12-09 08:18:06
回答 5查看 3.3K关注 0票数 1

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

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

代码语言:javascript
复制
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()在下面的代码片段中不起作用,编译器将输出一个错误:

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-09 08:32:16

根据@Will的回答(这是正确的),您可以更好地构建您的层级结构。例如,您对每种媒体类型执行不同的操作,但每种类型仍然会被使用。

因此,将基类更改为一个名为Consume()的抽象基方法,然后在每个派生类中重写并实际实现该方法,这样您就可以传递基类的实例,而无需在每个媒体类型上进行强制转换来调用Consume()方法:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-12-09 08:35:28

您可以将方法添加到基类,而不会出现任何问题。出现编译器错误的原因是您错误地使用了override关键字。

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

既然书、电影和电影都可以“表演”,你可以考虑让你的类像这样:

代码语言:javascript
复制
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 }
}
票数 3
EN

Stack Overflow用户

发布于 2012-12-09 08:24:18

Base_Collection没有名为Read_Book的方法。要调用派生类上的方法,需要强制转换,例如

代码语言:javascript
复制
(Book)book.Read_Book();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13783362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档