关于c#:正确设计类层次结构

Proper design of class hierarchy

我正在尝试用C语言设计一个类层次结构,以正确地为我的应用程序模型建模。问题是我不确定哪种方法是正确的。

假设我有一个order类,它应该是所有order类型的基础(抽象)类,以及使用order s时使用的引用类型。order类只有一个"重要"方法:让我们称之为order.placeOrder(),但有多个(正交)要求订单可能必须执行(或不执行):记录订单的放置,异步放置订单(placeOrder方法立即返回)以及其他。

现在,我想制作实际的具体类,它可以支持任意数量的这些需求。例如:googleorder类:loggedorder、asyncorder等类AppleOrder:AsyncOrder类别MicrosoftOrder:订单

问题是:如果我想通过派生所有的"策略"来创建这样一个类,那么它们(除了一个)都必须是接口,而我希望继承实际的实现并避免代码的复制/粘贴,我不确定如何做。

我来自C++背景,在这里我可以从多个基类派生出来(或者可能使用一个基于策略的设计,就像Andrei Alexandrescu在他的书中描述的),但是在C语言中,我不知道如何去做它,尽管这似乎是一个非常普遍的问题,一个我现在应该知道的问题。

非常感谢您的帮助!


看起来您的设计需要"decorator模式",decorator模式提供了动态添加职责/角色的灵活性,并且使用不同的组合,而不是使用继承。

下面是如何实现decorator的示例:

http://alagesann.com/2013/08/16/decorator-pattern-made-easy/http://en.wikipedia.org/wiki/decorator_模式

希望有帮助。

这是您的场景的示例代码。看看是否有帮助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 public abstract class Order
    {
        public abstract void PlaceOrder(); // log the placeing of the ordr, place the order asynchronously
    }
    public class MicrosoftOrder : Order // default order
    {
        public void PlaceOrder()
        {
            // default implementation for placing order.
        }
    }
    public class AppleOrder : Order // for asycn functionalities.
    {
        private Order order;
        public AppleOrder(Order order)
        {
            this.order = order;
        }
        public void PlaceOrder()
        {
            // Implement async functionalities.
            // you can also call default order as
            // order.PlaceOrder();
        }
    }
    public class GoogleOrder : Order // logged order
    {
        private Order order;
        public GoogleOrder(Order order)
        {
            this.order = order;
        }
        public void PlaceOrder()
        {          
            // Implement logged order
            // you can also call default order as
            // order.PlaceOrder();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Order order = new MicrosoftOrder();
            order.PlaceOrder(); // Default Order;
            Order orderWithAsync = new AppleOrder(order);
            orderWithAsync.PlaceOrder(); // Place order with asycn

            Order orderWithAsyncAndlogging = new GoogleOrder(orderWithAsync);
            orderWithAsyncAndlogging.PlaceOrder(); // order with asynch and logging.            
        }
    }