【问题标题】:Can't call method inside of a inherited class from Main无法在从 Main 继承的类中调用方法
【发布时间】:2015-10-20 23:24:46
【问题描述】:

我创建了一个基本模板程序,帮助我理解接口、类等。

我想要实现的只是调用一个位于继承的类层次结构中的方法。

我收到此错误:

“Book”不包含“BulkOrder”的定义,并且找不到接受“Book”类型的第一个参数的“BulkOrder”的扩展方法(您是否缺少 using 指令或程序集引用?)

这是主程序

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

【问题讨论】:

    标签: c# class inheritance methods


    【解决方案1】:
    class BulkBook : Book
        ...
        public void BulkOrder()
        {
            Copies = Copies + BATCH_SIZE;
        }
    

    BulkOrder 方法只存在于BulkBook 类中,不存在Book 类中。

    【讨论】:

    • 更重要的是,向上转型是免费的。向下转型不是
    • 这个答案不是很有帮助。谢谢
    • @DannyWatson :以上答案告诉您错误的根本原因。问题在于类型。
    【解决方案2】:

    由于BulkOrder 存在于BulkBook 而不是Book,您需要将book2 转换为BulkBook

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

    【讨论】:

    • 感谢 Mike,解决了问题。选角是我们的讲师没有告诉我们的事情,这很令人沮丧,我每年支付 7800 英镑,但选角没有进入课程材料
    • 我以为只有在引用可变数据类型时才使用强制转换?
    • 这在你的主方法中起作用的原因是你的主方法“知道”你的对象是继承类型BulkBook。但是,当您将它传递给方法(它接受基本类型 Book)时,在您指定之前它不知道更多信息。
    • 铸造有很多用途,在这种情况下,您想告诉编译器它是您正在处理的Book 的特定版本。我将用另一种方式来更新我的答案来处理你的情况
    • @DannyWatson 请注意,像这样的向下转换通常意味着您做错了什么,并且总是检查转换是否会成功(或准备好对于InvalidCastException)
    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多