抽象类方法重写另一个抽象类的方法

时间:2014-12-08 07:48:40

标签: oop design-patterns decorator

让我们说我有这行代码:

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

我们有实现AbstractCustomer的客户:

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

这就是问题开始的地方(这是一个帮助类,其目的是轻松调用方法)

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类没有实现User的抽象方法(好吧,我想我做了因为我尝试在AbstractCustomer中覆盖它)。但显然,我们不需要在Abstract类中覆盖它,因为子类(Customer)将自动继承它,从那里你可以直接覆盖方法。我在overriding abstract methods in an inherited abstract class

  2. 找到了解释
  3. 但通过上述解决方案,它提出了另一个问题。 AbstractCustomer类将失去其目的,因此HelperClass不能调用任何方法,因为它的静态类依赖于将在方法中传递的AbstractCustomer。

  4. 所以对于这些问题:( 问题:将方法分组为静态类,以便我轻松调用它)

    1. 有没有办法解决这类问题?(我正在考虑使用装饰模式)
    2. 如果我使用装饰器模式,ConcreteComponent的目的是什么?如果我删除它可以吗?
    3. 如果我不使用装饰器模式,是否有任何模式可用于此类问题?
    4. 如果我不使用任何模式,有什么方法可以解决这个问题吗?
    5. 感谢阅读!对不起,因为它很长! :)

1 个答案:

答案 0 :(得分:0)

您的解决方案与Decorator模式无关。装饰器 - 它应该是从现有的抽象继承(在你的情况下是AbstractCustomer)并为它添加额外的逻辑(它可以是日志记录,或者它可以额外检查每个方法的参数为null,或类似的东西.. )。请参阅this link

不过,我不喜欢你构建抽象的方式。最好为每个方法提供细粒度的接口,例如ICanCreate用于Create()方法,ICanRemove用于Remove()方法等。它允许您控制将实现该功能的其他类型。例如,一个客户只能实现ICanCreate接口,另一个客户只能实现ICanCreate + ICanRemove等。