繁体   English   中英

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

[英]How to create new methods in classes derived from an 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 两者之间的区别在这里得到了回答。

由于书籍,电影和电影都可以“表演”,因此您可能要考虑制作这样的课程:

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

除了@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();
    }
}

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

(Book)book.Read_Book();

不能覆盖不存在的方法。 删除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提到的一样,重新考虑类的层次结构。

您应该从公共重写void Read_Book()中删除override关键字,或者将此函数添加到Base_Collection中,如下所示

    public abstract void Read_Book();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM