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

如何在不强制转换的情况下存储传递给超类的依赖项的本地副本

  •  2
  • sprinter  · 技术社区  · 8 年前

    考虑以下在构造函数中注入依赖项的情况:

    class Dependency extends AbstractDependency {
    }
    
    class Super {
        private final AbstractDependency dependency;
    
        public Super(AbstractDependency dependency) {
            this.dependency = dependency;
        }
    
        protected AbstractDependency getDependency() {
            return dependency;
        }
    }
    
    class Sub {
        private final Dependency dependency;
    
        public Sub() {
            super(new Dependency(...));
            this.dependency = (Dependency)dependency;
        }
    }
    

    我想要达到的是 Sub 方法能够使用 AbstractDependency 不用一直投。

    我的问题是:有没有一种优雅的方法可以摆脱 附属的 ? super(dependency = new Dependency()) 不允许。

    2 回复  |  直到 8 年前
        1
  •  1
  •   shmosel    8 年前

    我认为最好使用泛型类型,因此首先不必保留重复引用:

    class Super<D extends AbstractDependency> {
        private final D dependency;
        //...
    }
    
    class Sub extends Super<Dependency> {
        public Sub() {
            super(new Dependency(...));
        }
    }
    
        2
  •  0
  •   tsolakp    8 年前

    首选方法是使用@shmosel提到的泛型。如果您不想使用泛型,那么我将避免扩展具体类,而只使用抽象方法,IMHO更干净:

    public abstract class Super {
        protected abstract AbstractDependency getDependency();
    }
    
    public class Sub {
        private final Dependency dependency;
    
        public Sub() {
            this.dependency = new Dependency();
        }
    
        protected AbstractDependency getDependency(){
            return dependency;
        }
    }