Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 抽象类方法重写另一个抽象类的方法_Oop_Design Patterns_Decorator - Fatal编程技术网

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

Oop 抽象类方法重写另一个抽象类的方法,oop,design-patterns,decorator,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 Abst

假设我有一行代码:

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);
    }
}
这就是问题开始的地方这是一个助手类,其目的是方便地调用方法

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);
 }
这些代码行会产生如下错误:

VS会告诉你Customer类没有实现用户的抽象方法,我想我实现了,因为我试图在AbstractCustomer中重写它。但是显然,我们不需要在抽象类中重写它,因为子类客户将自动继承它,并且从那里您可以直接重写这些方法。我在这里找到了解释

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

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

有没有办法解决这类问题?我正在考虑使用decorator模式 如果我使用decorator模式,那么concrete组件的用途是什么?如果我移除它,可以吗? 如果我不使用decorator模式,是否有任何模式可用于此类问题? 如果我不使用任何模式,有没有办法解决这个问题?
谢谢你的阅读!很抱歉,因为它很长

您的解决方案与装饰器模式无关。Decorator——在您的案例中,它应该继承自现有的抽象抽象抽象客户,并向其添加额外的逻辑。它可以是日志记录,也可以是对每个方法的参数进行额外的null检查,或者诸如此类。。。。看


顺便说一句,我不喜欢你构建抽象概念的方式。最好为您的每个方法都提供粒度良好的接口,例如ICanCreate for Create method、ICanRemove for Remove method等。它允许您控制将实现该功能的其他类型。例如,一个客户只能实现ICanCreate接口,另一个客户可以实现-ICanCreate+ICanRemove,等等。

首先,如果要覆盖一个方法,被覆盖的方法必须具有与基本方法相同的签名,并且具有相同的数量、顺序和参数类型。这就是VS抱怨的原因。其次,我绝对不明白静态类是如何让事情变得更简单的。。。