【问题标题】:cannot declare a body because it is marked abstract无法声明主体,因为它被标记为抽象
【发布时间】:2017-11-17 13:58:34
【问题描述】:

嗨,我是 C# 控制台应用程序的新手,我正在使用抽象和覆盖,但我在 public abstract double Compute() 的第一个方法中得到堆栈,我遇到了一个错误,它说 无法声明主体,因为它被标记为抽象请帮助我。谢谢你!

`

abstract class Cake
    {
        public string _flavor, _size;
        public int _quantity;

        public Cake(string flavor, string size, int quantity)
        {
            _flavor = flavor;
            _size = size;
            _quantity = quantity;
        }

        public abstract double Compute()
        {
            double price;
            if(_flavor == "Chocolate" && _size == "Regular")
            {
               price = 250.50;
            }
            else if (_flavor == "Chocolate" && _size == "Large")
            {
                price = 450.50;
            }
            else if (_flavor == "Strawberry" && _size == "Regular")
            {
                price = 300.50;
            }
            else
            {
                price = 500.75;
            }
            return price;
        }
    }

    class BirthdayCake:Cake
    {
        public int _numOfCandles;

        public BirthdayCake(string flavor, string size, int quantity, int numOfCandles):base(flavor,size,quantity)
        {
            _numOfCandles = numOfCandles;
        }

        public override double Compute()
        {
            return _numOfCandles * 10.00;
        }
    }`

【问题讨论】:

  • 当您有默认实现但希望允许子类覆盖时,请使用 virtual 而不是 abstract
  • 如果你在一个抽象类中声明一个抽象函数,你不应该在同一个类中声明body。它必须实现其派生类。

标签: c#


【解决方案1】:

当您有默认实现但希望允许子类时,请使用 virtual 而不是 abstract覆盖

【讨论】:

    【解决方案2】:

    如前所述,您不能为 abstract functionabstract class 声明主体。

    您需要创建另一个继承自 abstract class 的类来声明您想要的主体。

    abstract class Cake
    {
        public string _flavor, _size;
        public int _quantity;
        abstract public double Compute();
    }
    
    class BirthdayCake : Cake
    {
        public int _numOfCandles;
    
    
        public BirthdayCake(string flavor, string size, int quantity, int numOfCandles):base(flavor,size,quantity)
        {
            _numOfCandles = numOfCandles;
        }
    
        public override double Compute()
        {
            //does your stuff
        }
    }
    

    【讨论】:

    • 根据示例,OP 更可能实际上想要使用虚拟而不是抽象。
    • @EdPlunkett 已编辑。
    【解决方案3】:

    抽象类是一个类,您可以在其中拥有抽象函数。

    抽象函数抽象类中的一个函数,它没有主体,它还强制你在派生类中覆盖它。

    您的问题是您编写了一个具有主体的抽象函数

    修正:使用virtual关键字代替abstractvirtual 不会强迫您重写该函数,您也可以在基类中拥有一个主体。 (注意:如果您使用 virtual function 而不是 abstract function,请从您的类中删除 abstract 关键字。)

    【讨论】:

    • 阿比曼努·桑杰。抽象类不强制要求至少有一个抽象函数。
    • 抽象类可以为空。
    • SunilDhappadhule,谢谢。我不确定。但是空抽象类有什么用呢?
    • Abhimanue Sanjay,没用,一个空的抽象类与接口非常等价,只是它可以扩展一个类
    【解决方案4】:

    抽象方法在同一个类中没有实现,因此方法定义后跟一个分号而不是普通的方法块。抽象类的派生类必须实现所有抽象方法。当抽象类从基类继承虚方法时,抽象类可以用抽象方法覆盖虚方法。例如:

    抽象方法在同一个类中没有实现-示例代码

    public abstract class A
    {
    public abstract void DoWork(int i);
    public String DoWork(String str)
    {
      return str;
    }
    
    }
    public class B:A
    {
        public virtual void DoWork(int i)
        {
            // here implementation.
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多