【发布时间】: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);
}
这些代码行会产生如下错误:
VS 会告诉你 Customer 类没有实现 User 的抽象方法(好吧,我想我做到了,因为我尝试在 AbstractCustomer 中覆盖它)。但显然,我们不需要在 Abstract 类中重写它,因为子类(Customer)将自动继承它,您可以从那里直接重写方法。我在这里找到了解释overriding abstract methods in an inherited abstract class
但是通过执行上述解决方案,它提出了另一个问题。 AbstractCustomer 类将失去其用途,因此 HelperClass 不能调用任何方法,因为它的静态类依赖于将在方法中传递的 AbstractCustomer。
所以对于问题:(问题:将方法分组到一个静态类中以便我轻松调用它)
- 有没有办法解决这种问题?(我正在考虑使用装饰器模式)
- 如果我使用装饰器模式,ConcreteComponent 的作用是什么?我去掉它可以吗?
- 如果我不使用装饰器模式,是否有任何模式可以解决这类问题?
- 如果我不使用任何模式,有没有办法解决这个问题?
感谢阅读!对不起,因为它很长! :)
【问题讨论】:
-
首先,如果你想覆盖一个方法,被覆盖的方法必须与基础方法具有相同的签名(相同的数量、顺序和类型的参数)。这就是VS抱怨的原因。其次,我绝对看不出你的静态类如何让事情变得“更容易”......
标签: oop design-patterns decorator