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抱怨的原因。其次,我绝对不明白静态类是如何让事情变得更简单的。。。