2014-12-08 202 views
0

的方法,比方說,我有這行代碼:抽象類的方法覆蓋另一個抽象類

public abstract class User 
{ 
    public string name; 
    public string email; 
    public string password; 

    public abstract void Create(); 
    public abstract void Remove(); 
    public abstract void Modify(); 
} 

然後又是抽象類:

public abstract class AbstractCustomer : User 
{ 
    public string address; 
    public Order order; 

    public abstract override void Create(string n,string e,string pa,int ph,string a); 
    public abstract override void Modify(string e, string pa, int ph, string a); 
    public abstract override void Remove(Order o); 
    public abstract void PlaceOrder(Item i); 
    public abstract void MakePayment(Order o); 
} 

,我們有客戶,它實現摘要客戶:

public class Customer : AbstractCustomer 
{ 

    public override void Create(string name, string email, string password, int phoneNum, string address) 
    { 
     this.name = name; 
     this.email = email; 
     this.password = password; 
     this.phoneNum = phoneNum; 
     this.address = address; 
     this.isActive = true; 

     ConnectionToDB.SaveCustToDB(); 
    } 
    public override void Remove(Order order) 
    { 
     order.CancelOrder(); 
    } 

    public override void Modify(string email, string password, int phoneNum, string address) 
    { 
     ConnectionToDB.UpdateCustInDB(); 
    } 

    public override void PlaceOrder(Item item) 
    { 
     order = new Order(item); 
    } 
    public override void MakePayment(Order order) 
    { 
     ConnectionToDB.SavePayToDB(order); 
    } 
} 

這就是問題出現的地方(這是一個幫手類,它的目的e是調用容易的方法)

public static void Create(AbstractCustomer user, string name, string email, string password, int phoneNum, string address) 
{ 
    user.Create(name, email, password, phoneNum, address); 
} 
public static void Remove(AbstractCustomer user, Order order) 
{ 
    user.Remove(order); 
} 
public static void Modify(AbstractCustomer user, string email, string password, int phoneNum, string address) 
{ 
    user.Modify(email, password, phoneNum, address); 
} 
public static void PlaceOrder(AbstractCustomer user, Item item) 
{ 
    user.PlaceOrder(item); 
} 
public static void MakePayment(AbstractCustomer user, Order order) 
{ 
    user.MakePayment(order); 
} 

碼的這些線路會產生這樣的錯誤:

  1. VS會告訴你,Customer類沒有實現用戶的抽象方法(當然,我認爲我做了,因爲我試圖在AbstractCustomer中重寫它)。但顯然,我們不需要在Abstract類中重寫它,因爲子類(Customer)會自動繼承它,並從那裏直接覆蓋方法。我發現這裏的解釋overriding abstract methods in an inherited abstract class

  2. 但是這樣做上述解決方案,它提供了另一個問題。 AbstractCustomer類將失去其用途,因此HelperClass無法調用任何方法,因爲其靜態類取決於將在方法中傳遞的AbstractCustomer。

所以對於問題:(問題:分組的方法分爲靜態類,我可以輕鬆地稱呼它)

  1. 是否有解決這種問題的方法(我? 「M使用Decorator模式)
  2. 如果我使用Decorator模式,什麼是ConcreteComponent的目的,在想什麼?是不是好,如果我刪除它?
  3. 如果我不使用裝飾模式,是否有任何模式可用於這種問題?
  4. 如果我不使用任何模式,有什麼辦法解決這個問題嗎?

感謝您的閱讀!很抱歉,因爲它長了一個! :)

+4

首先,如果你想覆蓋的方法,該覆蓋方法必須具有相同的簽名基地之一(相同數量,順序和類型的論據)。這就是VS抱怨的原因。其次,我絕對沒有看到你的靜態類如何讓事情變得「容易」...... – 2014-12-08 08:19:49

回答

0

您的解決方案是不相關的Decorator模式。裝飾者 - 它應該從現有的抽象(你的案例中的AbstractCustomer)繼承,並添加額外的邏輯(它可以是日誌記錄,或者它可以額外檢查每個方法的參數爲null,或類似的東西.. )。見this link

順便說一句,我不喜歡你如何構建你的抽象的方式。對每種方法都有更好的接口,例如ICanCreate for Create()方法,ICanRemove for Remove()方法等。它允許您控制將實現該功能的其他類型。例如,一個客戶只能執行ICanCreate接口,另外一個 - ICanCreate + ICanRemove等

相關問題