2010-10-01 9 views
0

j'ai sous le code qui fonctionne bien:code ne fonctionne pas quand j'utiliser mot-clé abstrait classe moyenne

public abstract class Beverage 
{ 
    public string description = "Unknown beverage"; 
    public virtual string getDescription() 
    { 
     return description; 
    } 
    public abstract double cost(); 
} 

public abstract class condimentDecorator : Beverage 
{ 
    // public abstract string getDescription(); 
} 

public class DarkRoast : Beverage 
{ 
    public DarkRoast() 
    { 
     description = "DarkRoast"; 
    } 
    public override double cost() 
    { 
     return 2.10; 
    } 
} 
public class Espresso : Beverage 
{ 
    public Espresso() 
    { 
     description = "Espresso"; 
    } 
    public override double cost() 
    { 
     return 1.99; 
    } 
} 

public class HouseBlend : Beverage 
{ 
    public HouseBlend() 
    { 
     description = "House Blend Coffee"; 
    } 
    public override double cost() 
    { 
     return .89; 
    } 
} 


public class Mocha : condimentDecorator 
{ 
    Beverage beverage; 
    public Mocha(Beverage beverage) 
    { 
     this.beverage = beverage; 
    } 

    public override string getDescription() 
    { 
     return beverage.getDescription() + ", Mocha"; 
    } 
    public override double cost() 
    { 
     return .20 + beverage.cost(); 
    } 
} 

public class Soy : condimentDecorator 
{ 
    Beverage beverage; 
    public Soy(Beverage beverage) 
    { 
     this.beverage = beverage; 
    } 

    public override string getDescription() 
    { 
     return beverage.getDescription() + ", Soy"; 
    } 
    public override double cost() 
    { 
     return .10 + beverage.cost(); 
    } 
} 

public class Whip : condimentDecorator 
{ 
    Beverage beverage; 
    public Whip(Beverage beverage) 
    { 
     this.beverage = beverage; 
    } 

    public override string getDescription() 
    { 
     return beverage.getDescription() + ", Whip"; 
    } 
    public override double cost() 
    { 
     return .10 + beverage.cost(); 
    } 
} 

Je l'utilise de cette façon:

protected void Page_Load(object sender, EventArgs e) 
    { 
     Beverage beverage2 = new DarkRoast(); 
     beverage2 = new Mocha(beverage2); 
     beverage2 = new Mocha(beverage2); 
     beverage2 = new Whip(beverage2); 
     Response.Write ("<br> " + beverage2.getDescription() + " : $" + beverage2.cost().ToString()); 
    } 

Problème: i veulent toutes les classes d'enfants de « condimentDecorator » pour passer outre avec force getDescription() funciton, pour que je l'ai écrit ci-dessous le code dans la classe « condimentDecorator »:

public abstract string getDescription(); 

mais cela fait des changements dans mon fonctionnement actuel et ne donne pas le résultat souhaité, il montre simplement "boisson inconnue" comme valeur de getDescription() qui est la valeur du parent le plus classe.

résultat normal:

DarkRoast, Mocha, Mocha, Whip : $2.6 

Résultat après avoir utilisé "string public abstract getDescription()":

Unknown beverage : $2.6 

S'il vous plaît me suggérer que dois-je écrire/changement afin que je puisse forcer les classes d'enfants de "condimentDecorator" pour remplacer "getDescription();" et obtient également resutl comme son travail sans elle.

Répondre

3

Je pense que votre hiérarchie de classe pourrait utiliser un peu de repenser.

Que diriez-vous ceci:

Ma suggestion est que vous créez une interface, IBeverage que vous mettre en œuvre sur tout ce qui est potable. Ensuite, vous créez une classe de base pour les boissons «fondamentales» - DarkRoast, Espresso, HouseBlend - comme vous l'avez fait maintenant.

Pour les Condiments, vous implémentez une nouvelle classe de base abstraite implémentant IBeverage, mais ne fournissant pas une implémentation GetDescription par défaut. Cette classe pourrait aussi prendre un IBeverage dans son constructeur pour forcer d'autres condiments à faire de même.

Quelque chose comme ça devrait fonctionner, je pense (non testé, décompilé - mais vous voyez l'idée)

public interface IBeverage 
{ 
    string GetDescription(); 
} 

public abstract class BeverageBase : IBeverage 
{ 
    public virtual string GetDescription() { return "Unknown Beverage"; } 
} 

public class DarkRoast : BeverageBase { ... } 
public class HouseBlend : BeverageBase { ...} 

public abstract class CondimentBase : IBeverage 
{ 
    public CondimentBase(IBeverage beverage) 
    { 
    Beverage = beverage; 
    } 
    protected IBeverage Beverage { get; set; } 
    public abstract string GetDescription(); 
} 

public class Mocha : CondimentBase 
{ 
    public Mocha(IBeverage beverage) 
    : base (beverage) 
    { } 
    public string GetDescription() 
    { 
    return Beverage.GetDescription() + ", Mocha"; 
    } 
} 
0

vous pouvez créer une nouvelle méthode comme ceci:

public abstract class condimentDecorator : Beverage 
{ 
    public override string getDescription() 
    { 
      return getDescriptionInternal(); 
    } 
    protected abstract string getDescriptionInternal(); 
} 

De cette façon, toutes les classes devraient mettre en œuvre getDescription indirectement.