c# - 类层次结构的适当设计

标签 c# class design-patterns hierarchy

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

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

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

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

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

非常感谢任何帮助!

最佳答案

您的设计似乎需要“装饰器模式”,装饰器模式可以灵活地动态添加职责/角色,并根据您的喜好以不同的组合方式添加职责/角色,而不是使用继承。

这里是关于如何实现装饰器的例子:

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

希望对您有所帮助。

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

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

关于c# - 类层次结构的适当设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19877594/

相关文章:

rest - DDD 和聚合事务边界

c# - 如何拦截每个试图在 C# 中使用 API 函数的行为?

c# - 如何将对象从一个方法初始化为类中的另一个方法?

c++ - 添加用户定义类型 C++

design-patterns - 实现协议(protocol)的最佳方式是什么?

java - 将参数传递给服务方法的好方法是什么?整个对象还是它的一些参数?

c# - 使用运行时类型调用通用方法并强制转换返回对象

c# - 如何获取文档中所有内容控件的列表?

c# - 从 ajax 数据创建的下拉列表中绑定(bind)数据

java - 如何将其变为 OOP