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

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

class CollectionWithCounter<T> implements Collection<T> {
	int elementsCount = 0;
	Collection base;
	
	public CollectionWithCounter(Collection<T> b) {
		base = b;
	}
	@Override
	public void add(T t) {
		elementsCount++;
		base.add(t);
	}
	
	@Override
	public void addRange(T[] ts) {
		elementsCount += ts.length;
		base.addRange(ts);
	}
}

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