【发布时间】:2020-03-12 14:58:35
【问题描述】:
我有一个Scenario,它使用A 或多个As。 A 是在这个 Scenario 之外创建的,但是在 A 内部创建的 B 不知道Scenario 它的实例。这就是想法,A 和 B 不必知道 Scenario 是如何工作的,他们只需要在引发/调用 UpdateEvent 时工作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var sce1 = new Scenario();
sce1.Add(new A(1));
sce1.Add(new A(3));
sce1.Update(2);
sce1.Update(5);
var sce2 = new Scenario();
sce2.Add(new A(6));
sce2.Update(0.3);
Console.ReadKey();
}
}
public class BasicEvent : EventArgs
{
public double Number { get; set; }
}
public abstract class toBeUpdated
{
public abstract void OnUpdate(object sender, BasicEvent e);
}
public class C : toBeUpdated
{
public double Number { get; set; }
public C(double num)
{
Number = num * num;
}
public override void OnUpdate(object sender, BasicEvent e)
{
Number = Math.Pow(e.Number, 2);
}
}
public class B : toBeUpdated
{
public double Number { get; set; }
public B(double num)
{
Number = num;
}
public override void OnUpdate(object sender, BasicEvent e)
{
Number *= e.Number;
}
}
public class A : toBeUpdated
{
private B B1 { get; set; }
private B B2 { get; set; }
private C C1 { get; set; }
public A(double number)
{
B1 = new B(number);
B2 = new B(number);
C1 = new C(number);
}
public override void OnUpdate(object sender, BasicEvent e)
{
Console.WriteLine($"Updating A.. Data = {B1.Number + B2.Number * C1.Number}");
}
}
public class Scenario
{
private event EventHandler<BasicEvent> UpdateEvent;
private List<toBeUpdated> toKeepTrack { get; set; }
public Scenario()
{
toKeepTrack = new List<toBeUpdated>();
}
public void Add(toBeUpdated obj)
{
toKeepTrack.Add(obj);
UpdateEvent += obj.OnUpdate;
}
public void doSomethingWithTheList()
{
....
}
public void Update(double num)
{
UpdateEvent?.Invoke(this, new BasicEvent() { Number = num });
Console.WriteLine();
}
}
}
我需要创建几个场景,我不能让它成为静态的。
【问题讨论】:
-
A&B是只订阅一个Scenario实例还是同时订阅多个? -
@Hayden 只有一个
-
您的问题是“现有的
A和B必须订阅不同的Scenario”吗? -
@LouisGo 不,A 和 A 内部创建的 B 的场景相同
-
我没有得到你的问题。
A和B的OnUpdate必须订阅Scenario的事件。这样一来,A和B就真的不知道是谁给OnUpdate打电话了。但是您认为这还不够,因为您想“使它们成为静态”。我不明白您为什么要“使它们成为静态”。一定有一些你没有在这个问题上发表的观点。我可能误解了你的问题。
标签: c# events architecture event-handling structure