【问题标题】:Java Implement an interface type method in implement interfaceJava在实现接口中实现接口类型方法
【发布时间】:2015-09-26 19:38:07
【问题描述】:

有一个接口叫Range like

public interface Range {
    public Range newRange(int from,int to);
    public boolean isIn(int value);
    public int min();
    public int max();
    public Range add(Range r);
}

在实现接口中,Range newRange(1,5)是设置1到5的范围数,Range add(Range r.newRange(6,8))方法在Range newRange(1,5)方法的基础上增加了1到5加上6到8的范围。 boolean isIn(int value) 如果值在此范围内,则返回。int min() 返回范围内的最小值。如何使用类作为引用类型来实现方法?通过传递一个对象?我的newRange

public Range newRange(int from,int to){
    RangeImplem impIns = new RangeImplem();
    impIns.from = from;
    impIns.to = to;
    return impIns;
}

我对这个问题一无所知,并且对作为引用类型的类有点困惑。谢谢。

【问题讨论】:

  • 实现它,你不需要。要使用它,您需要..
  • newRange 不应该是接口的方法。那是(通常)实现Range 接口的类的构造函数。在您的情况下,这将是 RangeImplem 类。

标签: java interface reference-type


【解决方案1】:

我认为您的界面不正确。 你称它为 Range,但它里面可以容纳多个范围。

因此,为了获得良好的解决方案,请向 Range 添加方法以获取多个范围。

或者这里有一些解决方法:

import java.util.HashSet;
import java.util.Set;

public class RangeImpl implements Range {

    private class SimpleRange {
        public SimpleRange(int from, int to) {
            this.from = from;
            this.to = to;
        }
        final int from;
        final int to;

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            SimpleRange that = (SimpleRange) o;

            if (from != that.from) return false;
            return to == that.to;

        }

        @Override
        public int hashCode() {
            int result = from;
            result = 31 * result + to;
            return result;
        }
    }

    private Set<SimpleRange> ranges=new HashSet<>();

    @Override
    public Range add(int from, int to) {
        ranges.add(new SimpleRange(from, to));
        return this;
    }


    @Override
    public int min() {
        return 0;
    }

    @Override
    public int max() {
        return 0;
    }

    @Override
    public Range add(Range r) {
        //1) first way If there is only 1 your implementation of Range.
        //extract ranges from inside
        if (ranges instanceof RangeImpl) {
            RangeImpl ri= (RangeImpl) r;
            ranges.addAll(ri.ranges);
        }
        return this;
    }



//    way2:
@Override
public boolean isIn(int value) {
    for (Range externalRange : externalRanges) {
        externalRange.isIn()
    }

    for (SimpleRange range : ranges) {
        range isin
    }
    return false;
}


    @Override
    Set<Range> externalRanges=new HashSet<>();
     //cache supplied ranges and use them in ither methods
    public Range add(Range r) {
        externalRanges.add(r);
        return this;
    }
}

【讨论】:

    【解决方案2】:
    Here is your answer:
    
    package com.genpact.java.interf;
    
    public interface Range {
    
        /**
        * Create a new Range object representing an integer interval starting from 'from' and 'to', both limits inclusive
        */
        public Range newRange(int from,int to);
    
        /**
        * Return if 'value' is in the range defined by this object
        */
        public boolean isIn(int value);
    
        /**
        * Return the minimum value in range
        */
        public int min();
    
        /**
        * Return the maximum value in range
        */
        public int max();
    
        /**
        * Add range 'r' to this range, and return 'this'.
        * 'r' and this may denote disjoint ranges, for instance:
        *  r.newRange(1,5).add(r.newRange(8,10)) denotes a range
        * including 1,2,3,4,5,8,9,10
    
        */
        public Range add(Range r);
    
    
    }
    
    package com.genpact.java.impl;
    
    import com.genpact.java.interf.Range;
    
    public class RangeImplem implements Range {
    
        private int from;
        private int to;
    
        public RangeImplem() {
            // TODO Auto-generated constructor stub
        }
    
        public RangeImplem(int from, int to) {
            this.from = from;
            this.to = to;
        }
    
        @Override
        public Range newRange(int from, int to) {
            Range range=new RangeImplem(from, to);
            return range;
        }
    
        @Override
        public boolean isIn(int value) {
            //Return if 'value' is in the range defined by this object
            if(value >= this.from && value <= this.to){
                return true;
            }
            return false;
        }
    
        @Override
        public int min() {
            return this.from;
        }
    
        @Override
        public int max() {
            return this.to;
        }
    
        @Override
        public Range add(Range r) {
            this.from = r.min();
            this.to = r.min();
            return newRange(this.from,this.to);
        }
    
    
        public static void main(String[] args) {
            RangeImplem r=new RangeImplem();
            System.out.println(r.newRange(1,5).isIn(3)); //=> returns true
            System.out.println(r.newRange(1,5).isIn(6)); //=> returns false
            System.out.println(r.newRange(1,5).add(r.newRange(8,10)).isIn(6)); //=> returns false
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 2011-05-16
      • 1970-01-01
      • 2021-11-30
      • 2014-04-17
      • 1970-01-01
      • 2011-11-20
      • 2014-04-12
      • 2019-01-08
      相关资源
      最近更新 更多