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

在以下示例中,我使用的是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);
        }
    }
}

除了@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关键字,方法名称和签名必须与父类中的方法名称和签名匹配,并且方法必须在基类中标记为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 }
}

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?

下一篇: Overriding an abstract method with a virtual one