簡體   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