让我们说我有这行代码:
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);
}
这些代码行产生如下错误:
VS会告诉你Customer类没有实现User的抽象方法(好吧,我想我做了因为我尝试在AbstractCustomer中覆盖它)。但显然,我们不需要在Abstract类中覆盖它,因为子类(Customer)将自动继承它,从那里你可以直接覆盖方法。我在overriding abstract methods in an inherited abstract class
但通过上述解决方案,它提出了另一个问题。 AbstractCustomer类将失去其目的,因此HelperClass不能调用任何方法,因为它的静态类依赖于将在方法中传递的AbstractCustomer。
所以对于这些问题:( 问题:将方法分组为静态类,以便我轻松调用它)
感谢阅读!对不起,因为它很长! :)
答案 0 :(得分:0)
您的解决方案与Decorator模式无关。装饰器 - 它应该是从现有的抽象继承(在你的情况下是AbstractCustomer)并为它添加额外的逻辑(它可以是日志记录,或者它可以额外检查每个方法的参数为null,或类似的东西.. )。请参阅this link。
不过,我不喜欢你构建抽象的方式。最好为每个方法提供细粒度的接口,例如ICanCreate用于Create()方法,ICanRemove用于Remove()方法等。它允许您控制将实现该功能的其他类型。例如,一个客户只能实现ICanCreate接口,另一个客户只能实现ICanCreate + ICanRemove等。