У вас есть несколько вариантов.
1) Создайте event
в CarClass и сохраните его в MyGames.
2) Используйте delegate
и передайте ссылку на функцию в объект CarClass
3) Добавьте свойство в CarClass типа MyGames (скажем, с именем «Владелец») и после создания CarClass присвойте ему «this»: myCar.Owner=this
. Итак, вы создали ссылку в объекте CarClass на его создателя, и код в CarClass может напрямую обращаться к методам его владельца.
Что лучше, зависит от ситуации и от того, как эти объекты будут использоваться. Событие, вероятно, предпочтительнее, так как оно предлагает наибольшую гибкость. Делегат менее гибок и более эффективен, чем мероприятие, хотя на самом деле он служит немного другим целям. (Событие действительно является продолжением делегата). Последний, вероятно, является наихудшей формой, поскольку он тесно связывает объекты, но у него есть время и место.
Вот # 1
public class CarClass
{
// A delegate is a pointer to a function. Events are really a way of late
// binding delegates, so you need to one of these first to have an event.
public delegate void ExplodedHandler(CarClass sender);
// an event is a construct which is used to pass a delegate to another object
// You create an event based for a delegate, and capture it by
// assigning the function reference to it after the object is created.
public event ExplodedHandler Exploded;
protected void CarCrash()
{
... do local stuff
// Make sure ref exists before calling; if its required that something
// outside this object always happen as a result of the crash then
// handle the other case too (throw an error, e.g.)/
// See comments below for explanation of the need to copy the event ref
// before testing against null
ExplodedHandler tempEvent = Exploded;
if (tempEvent != null) {
tempEvent(this);
}
}
}
public class MyGames
{
...
...
CarClass myCar = new CarClass(...);
myCar.Exploded += new ExplodedHandler(GameOver);
Main () {
MyGames game = MyGames(...);
}
void GameOver(CarClass sender) {
// Do stuff
}
}