2015-10-20 66 views
0

我創建了一個基本模板程序,幫助我瞭解接口,類和類。無法從Main中調用繼承類的方法

我想實現的只是調用駐留在繼承的類層次結構中的方法。

我收到此錯誤:

'Book' does not contain a definition for 'BulkOrder' and no extension method for 'BulkOrder' accepting a first argument of type 'Book' could be found(are you missing a using directive or an assembly reference?)

這是主程序

Main 
{ 
BulkBook book2 = new BulkBook(FILLER); 
BulkOrder(book2); 
} 


public static void BulkOrder(Book book2) 
{ 
Console.WriteLine(Filler text); 
book2.BulkOrder(); <------- belongs in inherited class 
} 

這是繼承的類結構

abstract class Publication 
various code 
class Book : Publication 
various code 
class BulkBook : Book 
various code 
public void BulkOrder() <------ method 
    { 
     Copies = Copies + BATCH_SIZE; 
    } 

回答

1

由於BulkOrder存在於BulkBook,而不是Book你需要投book2BulkBook

((BulkBook)book2).BulkOrder(); 

然而,你可能希望驗證book2事實上是BulkBook

if (book2 is BulkBook) 
{ 
    ((BulkBook)book2).BulkOrder(); 
} 

替代解決辦法是讓該方法接受類型BulkBook而不是Book

public static void BulkOrder(BulkBook book2) 
{ 
Console.WriteLine(Filler text); 
book2.BulkOrder(); //This should now work 
} 
+0

感謝邁克,修復它。鑄造是我們的講師不告訴我們的東西,這是相當令人沮喪的,我每年支付7800英鎊,並且鑄造沒有進入課程材料 –

+0

我認爲鑄造僅在涉及變量數據類型時才使用? –

+0

在你的主要方法中工作的原因是你的主要方法「知道」你的對象是繼承類型'BulkBook'。然而,當你將它傳遞給方法(接受基本類型'Book')時,它只是在指定之前對它沒有更多的瞭解。 – MikeH

2
class BulkBook : Book 
    ... 
    public void BulkOrder() 
    { 
     Copies = Copies + BATCH_SIZE; 
    } 

BulkOrder方法只存在於BulkBook類中,而不存在於Book類中。

+1

更重要的是,上傳是免費的。向下轉換是**不是**。 – BradleyDotNET

+0

這個答案不是很有幫助。謝謝 –

+1

@DannyWatson:以上答案告訴你錯誤的根源。這個問題是與類型。 – DarkKnight