Salut, je suis nouveau dans l'application console C # et j'utilise abstract et override, mais j'obtiens la pile dans la première méthode de Public Abstract Double Compute () j'ai eu une erreur et il dit impossible déclarer un corps car il est marqué comme abstrait. Merci!

"

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;
        }
    }`
c#
4
Yad Young 17 nov. 2017 à 16:58

4 réponses

Meilleure réponse

Utilisez virtuel au lieu de abstract lorsque vous avez une implémentation par défaut mais que vous souhaitez autoriser les sous-classes à se substituer

7
Pieter Geerkens 17 nov. 2017 à 14:03

Comme dit, vous ne pouvez pas déclarer un corps pour un abstract function d'un abstract class.

Vous devez créer une autre classe héritée de votre abstract class qui déclare le corps que vous voulez.

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
    }
}
2
17 nov. 2017 à 14:16

La classe abstraite est une classe dans laquelle vous pouvez avoir des fonctions qui sont abstraites .

La fonction abstraite est une fonction à l'intérieur d'une classe abstraite qui n'a pas de corps et qui vous oblige également à la remplacer dans la classe dérivée.

Le problème ici est que vous avez écrit une fonction abstraite qui a un corps.

Fix : Utilisez le mot clé virtuel au lieu de abstrait . virtual ne vous oblige pas à remplacer la fonction et vous pouvez également avoir un corps dans votre classe de base. (NB: si vous utilisez fonction virtuelle au lieu de fonction abstraite , supprimez également le mot-clé abstract de votre classe.)

1
Abhimanue Sanjay 2 mai 2019 à 05:45

Les méthodes abstraites n'ont pas d'implémentation dans la même classe, donc la définition de méthode est suivie d'un point-virgule au lieu d'un bloc de méthode normal. Les classes dérivées de la classe abstraite doivent implémenter toutes les méthodes abstraites. Lorsqu'une classe abstraite hérite d'une méthode virtuelle d'une classe de base, la classe abstraite peut remplacer la méthode virtuelle avec une méthode abstraite. par exemple:

Les méthodes abstraites n'ont pas d'implémentation dans le même code d'échantillon de classe

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.
    }
}
0
Sunil Dhappadhule 2 mai 2019 à 04:03
47352307