2010-10-01 15 views
0

我有下面的代碼使用抽象的關鍵字這是工作的罰款:代碼不工作,當我在中產階級

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

我以這種方式使用它:

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

的問題:我希望所有子類「condimentDecorator」來強制覆蓋getDescription()功能可按,對,我在「condimentDecorator」類下面寫代碼:

public abstract string getDescription(); 

但是,這使得我目前的功能發生了變化,並且沒有給出想要的結果,它只是將「未知飲料」顯示爲getDescription()的值,它是父類大部分類的值。

正常結果:使用後

DarkRoast, Mocha, Mocha, Whip : $2.6 

結果「公共抽象的字符串getDescription()」:

Unknown beverage : $2.6 

請建議我該怎麼寫/變化,這樣我可以強制的子類「condimentDecorator」重寫「getDescription();」並且在沒有它的情況下也能獲得resutl的工作。

回答

3

我認爲你的類層次結構可以使用一些反思。

如何:

我的建議是您創建的是飲用的一切實現一個接口,IBeverage。然後,您創建「基本」飲料的基礎類 - DarkRoast,Espresso,HouseBlend - 就像您現在所做的一樣。

對於調味品,您可以實現一個實現IBeverage的新抽象基類,但不會提供默認的GetDescription實現。這個類也可以在其構造函數中使用IB平衡來強制其他調味品也這樣做。

像這樣的東西應該工作,我認爲(未經檢驗,未編譯 - 但你的想法)

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

,你可以像這樣創建一個新方法:

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

這樣一來,所有的類必須實現間接getDescription。