You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展基类逻辑并实现派生类的赋值兼容?

解决方案:使用装饰器模式扩展Item功能

要解决在不修改现有Item派生类的前提下扩展功能,同时保持与Item基类兼容性的问题,装饰器模式是最优选择——它通过包装现有对象来添加新行为,既避免了继承层级的混乱,又能完全兼容原有代码。

实现步骤

  1. 创建装饰器类
    让MovingItem继承自Item,内部持有一个Item实例(即被装饰的对象),同时添加移动相关属性:

    public class MovingItem : Item
    {
        private readonly Item _wrappedItem;
    
        // 移动扩展属性
        public Vector2 Acceleration { get; set; }
        public Vector2 Velocity { get; set; }
        public Vector2 Position { get; set; }
    
        // 构造函数传入要包装的Item实例
        public MovingItem(Item item)
        {
            _wrappedItem = item ?? throw new ArgumentNullException(nameof(item));
        }
    
        // 重写Item中的抽象/虚方法,将逻辑委托给被包装的实例
        // 示例:假设Item有Name属性和Use()方法
        public override string Name => _wrappedItem.Name;
    
        public override void Use()
        {
            _wrappedItem.Use();
            // 可选:添加移动相关的额外逻辑
        }
    }
    
  2. 使用装饰器包装现有对象
    直接用MovingItem包裹任何Item派生类的实例,即可获得移动功能,同时能被ItemCollection接收:

    // 创建原有Weapon实例
    var weapon = new Weapon();
    
    // 包装成带移动属性的MovingItem
    var movingWeapon = new MovingItem(weapon)
    {
        Position = new Vector2(10, 20),
        Velocity = new Vector2(5, 0),
        Acceleration = new Vector2(0, 1)
    };
    
    // 完全兼容ItemCollection的Add方法
    var itemsCollection = new ItemCollection();
    itemsCollection.Add(movingWeapon);
    

方案优势

  • 无需修改第三方类:不管Weapon、Sphere是第三方库还是内部类,都不需要修改其继承关系或代码
  • 扩展性强:未来要添加PickupableItem这类扩展,只需再创建一个继承自Item的装饰器类,甚至可以多层嵌套装饰(比如new PickupableItem(new MovingItem(new Sprite())))
  • 完全兼容原有逻辑:MovingItem本身就是Item的子类,所有接收Item的方法(如ItemCollection.Add)都能直接使用

注意事项

  • 如果Item包含抽象方法或虚方法,MovingItem必须重写这些方法并委托给内部的_wrappedItem,才能保留原有对象的核心逻辑
  • 若需要访问派生类的特定方法(比如Weapon.Fire()),可以在装饰器中添加适配方法:
    public void Fire()
    {
        if (_wrappedItem is Weapon weapon)
        {
            weapon.Fire();
        }
    }
    

内容的提问来源于stack exchange,提问作者ZecosMAX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:55:13