所以我試圖創建自己的事件來初始化一個名爲Car的類,該類繼承自Automobile對象。下面是C#代碼相同:爲對象的初始化創建自己的事件
`
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Abc.Training.Artifacts;
namespace Abc.Training.Objects
{
public abstract class Automobile
{
public string Model { get; set; }
public string Manufacturer { get; set; }
public string YoM { get; set; }
}
public class Car : Automobile
{
public static event Delegates.ObjectInitHandler OnInit;
public string MarketSegment { get; set; }
public int BootSpace { get; set; }
public Car(string model, string manufacturer, string yom)
{
Model = model ;
Manufacturer = manufacturer;
YoM = yom;
ObjectInitEventArgs eArgs = new ObjectInitEventArgs();
eArgs.IsResidentObject = true;
eArgs.ObjectType = this.GetType();
if (OnInit != null) OnInit(this, eArgs);
}
}
}
`
的ObjectInitHandler及其ARGS(這裏使用的委託類型)也由我創建爲:
`
public delegate void ObjectInitHandler(object sender, ObjectInitEventArgs e);
public class ObjectInitEventArgs:EventArgs
{
public Type ObjectType { get; set; }
public bool IsResidentObject { get; set; }
}
`
我訂閱瞭如下事件:
`
Car.OnInit += new Delegates.ObjectInitHandler(Car_OnInit);//able to do this as event is static
Car c = new Car("Maruti", "Maruti", "2004");
void Car_OnInit(object sender, ObjectInitEventArgs e)
{
Console.WriteLine("Car object initialized");
}
`
我想創建該類事件的OnInit。但是,如果我在發佈者(我的Car類)中放置實例事件OnInit,則必須先初始化該類,然後才能訂閱此事件。由於我想在初始化時觸發這個事件,這對我來說成了一個雞和雞蛋的問題。
我解決它通過創建靜態事件對象和執行對象的初始化前的訂閱,如下所示(這是從上方本身的代碼的片段):
public static event Delegates.ObjectInitHandler OnInit;
然而,在ASP .NET應用程序,這將意味着如果多個用戶訪問這個應用程序,我將擁有相同的委託對象,它將具有重複的事件訂閱(因爲它的靜態),這顯然不是很酷。
是否有一個設計模式,我可以遵循該事件也作爲實例成員,但我仍然可以在實例化之前訂閱該事件?
我假設你想在創建它之前爲你的實例添加多個事件處理程序!在這種情況下,您應該將您的回調集中到數組中(Action [] callBackArray),將它傳遞給您的新車,然後在構造函數中將所有回調添加到您的事件中。 這種方式在構造函數結束時,事件將調用所有先前分配的函數... – Shamim