public abstract Range <T> Intersect(Range <T> other);
public abstract Range <T> Add(Range <T> other);
public virtual Range <T> Subtract(Range <T> other) { return(Intersect(other.Complement)); }
public abstract bool OverlapsWith(Range <T> other);
public override Range <T> Intersect(Range <T> other) { return(other); }
public override Range <T> Add(Range <T> other) { return(this); }
public override bool OverlapsWith(Range <T> other) { return(true); }
public override Range <T> Subtract(Range <T> other) { return(this); }