I think you're misinterpreting what the interface segregation principle says. In your case you're fine and are not "forcing" any implementation. In fact you're applying the Template method design pattern
If you had a hypothetical
interface ICommunicateInt
{
int Receive();
void Send(int n);
}
in order to implement it, your Base
class would be forced to implement a Send
method that it does not need.
So, the ISP suggests that it is better to have:
interface ISendInt
{
void Send(int n);
}
interface IReceiveInt
{
int Receive();
}
so your classes can choose to implement one or both. Also methods in other classes that need a class that can send an Int, can require a
void Test(ISendInt snd)
// void Test(ICommunicateInt snd) // Test would "force" snd to depend on
// a method that it does not use