代码之家  ›  专栏  ›  技术社区  ›  Shaddix

OOP:具体情况下的组成或继承

  •  4
  • Shaddix  · 技术社区  · 14 年前

    我们刚刚和大学讨论了一下OOP是否可以接受以下样式。

    我们有一个类,它有一个公共函数,并且在构造函数中需要一个阅读器:

    public class Converter
    {
        private readonly IReader _reader;
    
        public Converter(IReader reader)
        {
            _reader = reader;
        }
    
        public byte[] Convert(...params...)
        {
             return something;
        }
    }
    

    我们有reader1和reader2,它们都实现了一个iReader。

    我想设置两个管理器:converter1和converter2,提供相同的public convert()函数,但converter1将使用reader1,converter2将使用reader2。

    对于我来说,最简单的解决方案是从转换器继承并用适当的读卡器初始化它:

    public class Converter1 : Converter
    {
        public Converter1():base(new Reader1())
        {}
    }
    public class Converter2 : Converter
    {
        public Converter2():base(new Reader2())
        {}
    }
    

    我的大学说,converter1和converter2是管理者,继承不应该用于管理者,我们应该在这里应用组合。但从我的角度来看,组合只会在特定的转换器类中产生额外的代码。

    那么,您能否建议一下,在实现管理器时是否可以使用继承? 谢谢

    3 回复  |  直到 14 年前
        1
  •  3
  •   Adrian Regan    14 年前

    你为什么要继承??

    根据您提供的示例,除了确保converter1/converter2强制使用特定类型的读卡器之外,您没有对基类执行任何其他操作。

    在我看来你的学院是对的。您应该做的是实现一个工厂方法,它将为您创建并填充正确配置的转换器。

    public static class ConverterFactory {
        public static CreateConverter1() { 
           return new Converter(new Reader1());
        }
        public static CreateConverter2() {
           return new Converter(new Reader2());
        }
    }
    
    ...
    Converter x = ConverterFactory.CreateConverter1();
    
        2
  •  2
  •   Jon Skeet    14 年前

    在我看来,这是对遗产的滥用。你不是专门的 行为 转换器-你只需要 建设 .

    特别是,您可以使用静态方法轻松地拥有一个静态类来执行此构造:

    public static class Converters
    {
        public static Converter CreateConverter1()
        {
            return new Converter(new Reader1());
        }
    
        public static Converter CreateConverter2()
        {
            return new Converter(new Reader2());
        }
    }
    

    这些甚至可能是正常情况下的静态方法 Converter 当然是课。

    事实上,它没有失去任何功能,这对我来说意味着继承是一个错误。

    再说一次,我经常怀疑继承权。正确地设计继承意味着计算扩展点,记录它们应该如何工作——这是一种平衡行为,在为调用者提供足够的信息以预测一致的行为和为实现者提供足够的空间以有效的方式改变行为之间进行平衡。在这里你什么都不做-你 只是 更改传递给构造函数的读取器。

        3
  •  0
  •   Igor    14 年前

    要么使用继承(如您所提议的),要么只使用一个转换器类,它将与多态iReader一起工作。