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

时间:2012-12-09 00:18:06

标签: 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);
        }
    }
}

5 个答案:

答案 0 :(得分:3)

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

为了使用override关键字,方法名称和签名必须与父类中的方法名称和签名匹配,并且方法必须标记为virtualabstract基类。两者之间的差异得到回答here

由于书籍,电影和电影都可以“#34;”,你可能需要考虑制作这样的课程:

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

(Book)book.Read_Book();

答案 3 :(得分:1)

无法覆盖不存在的方法。删除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提到的那样。

答案 4 :(得分:0)

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

    public abstract void Read_Book();
相关问题