【问题标题】:Cover the methods in inheritance覆盖继承中的方法
【发布时间】:2011-09-13 21:35:28
【问题描述】:

导入 java.util.AbstractList;

公共类 ItemSet 扩展 AbstractList {

private Item[] arr;
private ItemClass itemClass;

public ItemSet(Item item) {
arr = new Item[1];
arr[0] = item;
}

/*
 * (non-Javadoc)
 * 
 * @see java.util.AbstractList#add(java.lang.Object)
 */
@Override
public boolean add(Item e) {
boolean isNotAdded = true;
for (int i = 0; i < arr.length; i++) {
    if (e.getRule().compareTo(arr[i].getRule())) {
    if (e.getDot() == arr[i].getDot()) {
        isNotAdded = false;
        break;
    }
    }
}
if (isNotAdded) {
    Item[] oldArr = arr;
    arr = new Item[oldArr.length + 1];
    System.arraycopy(oldArr, 0, arr, 0, oldArr.length);
    arr[oldArr.length] = e;
}
return isNotAdded;
}

@Override
public Item get(int index) {
return arr[index];
}

@Override
public int size() {
return arr.length;
}

// SETTER

/**
 * @param itemClass
 *            the itemClass to set
 */
public void setItemClass(ItemClass itemClass) {
this.itemClass = itemClass;
}

//

// GETTER

/**
 * @return the itemClass
 */
public ItemClass getItemClass() {
return itemClass;
}
//

}

如何覆盖例如删除方法? 如何不使用自己的列表实现?

【问题讨论】:

  • “封面”是什么意思?请澄清您的问题。
  • 我想他不想实现接口的其他方法。
  • 不应该是ItemSet 扩展AbstractSet 吗?

标签: java inheritance


【解决方案1】:

如果不想实现接口中的其他方法,只需定义它们抛出异常即可:

public bool remove(Object o)
{
    throw new UnsupportedOperationException();
}

如果你不想这样做,你应该从一个类继承,而不是实现一个接口。

【讨论】:

    【解决方案2】:

    如果您不想继承 remove(),则不要扩展 AbstractList,而是将您想要的方法委托给 ArrayList

    像这样(看在上帝的份上,不要评论你的 setter 和 getter)

        public class ItemSet {
        private final ArrayList<Item> items = new ArrayList<Item>();
        private ItemClass itemClass;
    
        public ItemSet(Item item) {
            items.add(item);
        }
    
        public boolean add(Item e) {
            boolean isNotAdded = true;
            for (Item item : items)
                if (e.getRule().compareTo(item.getRule()))
                    if (e.getDot() == item.getDot()) {
                        isNotAdded = false;
                        break;
                    }
            // why are you adding here?
            if (isNotAdded)
                items.add(e);
            return isNotAdded;
        }
    
        public Item get(int index) {
            return items.get(index);
        }
    
        public int size() {
            return items.size();
        }
    
        public void setItemClass(ItemClass itemClass) {
            this.itemClass = itemClass;
        }
    
        public ItemClass getItemClass() {
            return itemClass;
        }
    }
    }
    

    【讨论】:

    • 这是一种好的java编程风格吗?我认为这对调用堆栈来说是个负担,不是吗?
    • 在 ArrayList 中调用 add() 以恒定时间运行。在您的实现中 System.arraycopy() 在 O(n) 时间内运行。这些事情比可能增加可能被优化掉的调用堆栈产生更大的差异(?)。更薄的公共接口也是更好的设计。
    • 在 ArrayList 中调用 add() 以恒定时间运行。在您的实现中 System.arraycopy() 在 O(n) 时间内运行。我知道这一点,我必须以快速的方式写,所以我不在乎这个。不过谢谢。更薄的公共接口也是更好的设计。什么意思?
    • 精简接口(暴露方法较少)减少了coupling
    猜你喜欢
    • 2012-11-20
    • 2016-06-04
    • 2016-01-25
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多