Java - Method name collision in interface implementation

前端 未结 7 1487
渐次进展
渐次进展 2020-11-22 13:23

If I have two interfaces , both quite different in their purposes , but with same method signature , how do I make a class implement both without being forced to write a sin

7条回答
  •  感动是毒
    2020-11-22 13:53

    The only solution that came in my mind is using referece objects to the one you want to implent muliple interfaceces.

    eg: supposing you have 2 interfaces to implement

    public interface Framework1Interface {
    
        void method(Object o);
    }
    

    and

    public interface Framework2Interface {
        void method(Object o);
    }
    

    you can enclose them in to two Facador objects:

    public class Facador1 implements Framework1Interface {
    
        private final ObjectToUse reference;
    
        public static Framework1Interface Create(ObjectToUse ref) {
            return new Facador1(ref);
        }
    
        private Facador1(ObjectToUse refObject) {
            this.reference = refObject;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (obj instanceof Framework1Interface) {
                return this == obj;
            } else if (obj instanceof ObjectToUse) {
                return reference == obj;
            }
            return super.equals(obj);
        }
    
        @Override
        public void method(Object o) {
            reference.methodForFrameWork1(o);
        }
    }
    

    and

    public class Facador2 implements Framework2Interface {
    
        private final ObjectToUse reference;
    
        public static Framework2Interface Create(ObjectToUse ref) {
            return new Facador2(ref);
        }
    
        private Facador2(ObjectToUse refObject) {
            this.reference = refObject;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (obj instanceof Framework2Interface) {
                return this == obj;
            } else if (obj instanceof ObjectToUse) {
                return reference == obj;
            }
            return super.equals(obj);
        }
    
        @Override
        public void method(Object o) {
            reference.methodForFrameWork2(o);
        }
    }
    

    In the end the class you wanted should something like

    public class ObjectToUse {
    
        private Framework1Interface facFramework1Interface;
        private Framework2Interface facFramework2Interface;
    
        public ObjectToUse() {
        }
    
        public Framework1Interface getAsFramework1Interface() {
            if (facFramework1Interface == null) {
                facFramework1Interface = Facador1.Create(this);
            }
            return facFramework1Interface;
        }
    
        public Framework2Interface getAsFramework2Interface() {
            if (facFramework2Interface == null) {
                facFramework2Interface = Facador2.Create(this);
            }
            return facFramework2Interface;
        }
    
        public void methodForFrameWork1(Object o) {
        }
    
        public void methodForFrameWork2(Object o) {
        }
    }
    

    you can now use the getAs* methods to "expose" your class

提交回复
热议问题