C# 正确设计类层次结构

C# 正确设计类层次结构,c#,class,design-patterns,hierarchy,C#,Class,Design Patterns,Hierarchy,我试图在C#中设计一个类层次结构,以正确地建模我的应用程序模型。 问题是我不确定哪种方法是正确的 假设我有一个Order类,它应该是所有订单类型的基类(抽象类)和使用订单时使用的引用类型。order类只有一个“重要”方法:我们称它为order.PlaceOrder(),但订单可能必须执行(或不执行)多个(正交)要求:记录订单的放置、异步放置订单(PlaceOrder方法立即返回)以及其他要求 现在,我想创建实际的具体类,这些类可以支持任何数量的这些需求。例如: GoogleOrder类:Logg

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

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

现在,我想创建实际的具体类,这些类可以支持任何数量的这些需求。例如: GoogleOrder类:LoggedOrder、AsyncOrder等 类AppleOrder:AsyncOrder 类MicrosoftOrder:Order

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

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


非常感谢您的帮助

您的设计似乎需要“Decorator模式”,Decorator模式提供了动态添加职责/角色的灵活性,可以根据您的喜好使用不同的组合,而不是使用继承

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

希望有帮助

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

 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.            
        }
    }

这个问题更适合程序员——您可能想使用,或者应该在单独的类层次结构中分离订单上的实际“操作”。例如,您将有基类“OrderProcessor”,然后是派生类“AsyncOrderProcessor”和“OrderLogger”。对于一些简单的东西,比如日志策略,很容易在构造函数中传入一个日志接口(即使是空的),并使用它来记录,但对于其他事情,比如执行异步,我看不出来……这些问题对我来说似乎不清楚。您不能将所有方法都放在基中,然后根据需要从派生的调用它们吗?我甚至不确定你是否已经解释了为什么你需要推导。嗯,从维基百科上的描述来看,这似乎正是我想要的。我需要再调查一下。我想这就是我要找的。但是,假设我使用的方法只需要创建和处理Google order。也许在这个例子中,三个装饰器应该重命名以反映它们的特定行为,用法应该如下:order googleOrder=new LoggedOrder(new AsyncOrder(new SimpleOrder());//和其他类似的订单类型。。。另外,我在想是否有更漂亮的方法来实例化订单。也许链接一个SetBehavior方法(返回对“this”的引用),你们怎么想?另外,我很快就会接受这个答案,因为它确实解决了我的问题。@user2190351为了简化订单和一组装饰器的创建,您可以看看生成器模式。使用它,订单的创建看起来像:
order order=orderBuilder.Async().Logged().GetOrder()