What NotPolitcallyCorrect wrote is right. Perhaps the following might give you some starting point.
void Main()
{
var s1 = new SensorNode(1, "don't care", 0, 0);
var s2 = new SensorNode(2, "don't care", 0, 0);
var sink = new Sink("don't care", 3, 0, 0);
sink.AddSensor(s1);
sink.AddSensor(s2);
s1.SendNewData();
s2.SendNewData();
s1.SendNewData();
}
public class EventArgs<T> : EventArgs
{
private readonly T _value;
public EventArgs(T value)
{
_value = value;
}
public T Value
{
get { return _value; }
}
}
public class Packet
{
public int SensorId { get; set; }
public string theData { get; set; }
public Packet(int id, string data)
{
SensorId = id;
theData = data;
}
}
public interface ISensorNode
{
event EventHandler<EventArgs<Packet>> DataSend;
}
class SensorNode : ISensorNode
{
public event EventHandler<EventArgs<Packet>> DataSend;
public int Id { get; set; }
public SensorNode(int id,string name,int depth, double energy)
{
Id = id;
}
public void SendNewData()
{
Packet p = new Packet(Id, "123.4");
var handler = DataSend;
var args = new EventArgs<Packet>(p);
handler?.Invoke(this, args);
}
}
class Sink
{
public Sink(string name, int Id , int xLocation, int yLocatio)
{
}
public void AddSensor(ISensorNode newSensor)
{
newSensor.DataSend += OnDataReceived;
}
private void OnDataReceived(object sender, EventArgs<Packet> e)
{
Packet packed = e.Value;
Console.WriteLine($"received data {packed.theData} from sensor with id {packed.SensorId}");
}
}