interface Collection<T> {
	void add(T t);
	void addRange(T[] ts);
}

abstract class AbstractCollection<T> implements Collection<T> {
	@Override
	public void addRange(T[] ts) {
		for (T t : ts) {
			add(t);
		}
	}
}

class CollectionWithCounter<T> extends AbstractCollection<T> {
	int elementsCount = 0;
	
	@Override
	public void add(T t) {
		elementsCount++;
	}
	
	@Override
	public void addRange(T[] ts) {
		elementsCount += ts.length;
		super.addRange(ts);
	}
}

class Main {
	public static void main(String[] args) {
		CollectionWithCounter<Object> cc;
		
		cc = new CollectionWithCounter<>();
		cc.add(null);
		cc.add(null);
		cc.add(null);
		System.out.println("elementsCount = " + cc.elementsCount);
		
		cc = new CollectionWithCounter<>();
		cc.addRange(new Object[3]);
		System.out.println("elementsCount = " + cc.elementsCount);
	}
}