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

在使用合成时,我们真的必须包装组件吗

  •  1
  • Virus721  · 技术社区  · 7 年前

    在这种情况下,将共享逻辑移到一个共享类中,然后将其用作组件可能会很方便。具有共享逻辑的方法调用被委托给该组件。

    例如:

    interface IFoo
    {
        void DoFoo();
    }
    
    interface IBar
    {
        void DoBar();
    }
    
    interface IBaz
    {
        void DoBaz();
    }
    
    class DefaultFoo()
    {
        public void Do() { /* Shared logic */ }
    }
    
    class DefaultBar()
    {
        public void Do() { /* Shared logic */ }
    }
    
    class FooBarBaz1 : IFoo, IBar, IBaz
    {
        DefaultFoo defaultFoo = new DefaultFoo();
        DefaultBar defaultBar = new DefaultBar();
    
        public void DoFoo() { defaultFoo.Do(); }
        public void DoBar() { defaultBar.Do(); }
        public void DoBaz() { /* FooBarBaz1 specific IBaz implementation */ }
    }
    
    class FooBarBaz2 : IFoo, IBar, IBaz
    {
        DefaultFoo defaultFoo = new DefaultFoo();
    
        public void Foo() { defaultFoo.Do(); }
        public void Bar() { /* FooBarBaz2 specific IBar implementation */ }
        public void Baz() { /* FooBarBaz2 specific IBaz implementation */ }
    }
    
    // More ForBarBazX classes...
    

    在课堂上 FooBarBaz1 FooBarBaz2 ,我们将 DefaultFoo 实例给公众的印象是 FooBarBaz2公司 他们正在做这项工作,而他们只是授权。

    所以我的问题是:我们不能不包装共享逻辑吗?

    我们应该:

    interface IFoo
    {
        DefaultFoo Foo { get; }
    }
    
    interface IBar
    {
        DefaultBar Bar { get; }
    }
    
    interface IBaz
    {
        DefaultBaz Baz { get; }
    }
    
    class DefaultFoo()
    {
        public virtual void Do() { /* Shared logic */ } // Note the virtual.
    }
    
    class DefaultBar()
    {
        public virtual void Do() { /* Shared logic */ } // Note the virtual.
    }
    
    class FooBarBaz1 : IFoo, IBar, IBaz
    {
        private class SpecificBaz : DefaultBaz
        {
            public override void DoBaz() { /* Specific logic */ }
        }
    
        public DefaultFoo Foo { get; private set; }
        public DefaultBar Bar { get; private set; }
        public DefaultBaz Baz { get; private set; }
    
        public FooBarBaz1()
        {
            Foo = new DefaultFoo();
            Bar = new DefaultBar();
            Baz = new SpecificBaz();
        }
    }
    
    class FooBarBaz2 : IFoo, IBar, IBaz
    {
        private class SpecificBar : DefaultBar
        {
            public override void Bar() { /* Specific logic */ }
        }
    
        private class SpecificBaz : DefaultBaz
        {
            public override void Baz() { /* Specific logic */ }
        }
    
        public DefaultFoo Foo { get; private set; }
        public DefaultBar Bar { get; private set; }
        public DefaultBaz Baz { get; private set; }
    
        public FooBarBaz1()
        {
            Foo = new DefaultFoo();
            Bar = new SpecificBaz();
            Baz = new SpecificBaz();
        }
    }
    

    而不是:

    ForBarBaz1 fooBarBaz = new ForBarBaz1();
    fooBarBaz.Foo();
    fooBarBaz.Bar();
    fooBarBaz.Baz();
    

    可以接触到暴露的组件:

    ForBarBaz1 fooBarBaz = new ForBarBaz1();
    fooBarBaz.Foo.Do();
    fooBarBaz.Bar.Do();
    fooBarBaz.Baz.Do();
    

    你觉得这个怎么样?似乎它保留了模块化,同时避免了大量“无用”的包装代码。

    0 回复  |  直到 7 年前
    推荐文章