【问题标题】:abstract class methods overriding the methods of another abstract class抽象类方法覆盖另一个抽象类的方法
【发布时间】:2014-12-08 07:48:40
【问题描述】:

假设我有这行代码:

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. 但是通过执行上述解决方案,它提出了另一个问题。 AbstractCustomer 类将失去其用途,因此 HelperClass 不能调用任何方法,因为它的静态类依赖于将在方法中传递的 AbstractCustomer。

所以对于问题:(问题:将方法分组到一个静态类中以便我轻松调用它)

  1. 有没有办法解决这种问题?(我正在考虑使用装饰器模式)
  2. 如果我使用装饰器模式,ConcreteComponent 的作用是什么?我去掉它可以吗?
  3. 如果我不使用装饰器模式,是否有任何模式可以解决这类问题?
  4. 如果我不使用任何模式,有没有办法解决这个问题?

感谢阅读!对不起,因为它很长! :)

【问题讨论】:

  • 首先,如果你想覆盖一个方法,被覆盖的方法必须与基础方法具有相同的签名(相同的数量、顺序和类型的参数)。这就是VS抱怨的原因。其次,我绝对看不出你的静态类如何让事情变得“更容易”......

标签: oop design-patterns decorator


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 2014-06-20
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2022-08-18
    • 2013-09-12
    相关资源
    最近更新 更多