Here is a simple example (built and tested with a mega2560), with a class that can be passed a Stream object, and sends a Hello over this generic stream object. When constructing the object, you can pass the Stream object you want to actually communicate:
#include "Arduino.h"
class MyProtocol
{
public:
MyProtocol(Stream& s):serial(s){}
void send(){
serial.println("Hello");
}
private:
Stream& serial;
};
MyProtocol p(Serial);
void setup() {
Serial.begin(9600);
}
void loop() {
delay(1000);
p.send();
}
NOTE: The serial.println() is not the Serial global object, note the lower case, it is the internal Stream class variable.