假设你的模型或视图模型需要显示一条消息,但它显然不想访问UI。所以它实现了一个有Notify(String)方法的接口。
现在,无论谁实现了这个接口,都可以显示消息,而这个对象通常是基于UI的类,需要传递给模型或视图模型。
我的问题是,即使只是以接口的形式传递一个UI对象,也会被皱眉头吗?
我已经用一个模拟例子说明了这个问题。
public interface INotify
{
void Notify(String msg);
}
class Model
{
INotify _notify;
public Model(INotify notify )
{
_notify = notify;
}
public void Add(int a, int b)
{
int result = a + b;
_notify.Notify("The result is " + result.ToString());
}
}
class View : INotify
{
public void Notify(String msg)
{
Console.Write("I am the view, I received this: ");
Console.WriteLine(msg);
}
}
class Program
{
static void Main(string[] args)
{
View view = new View();
Model model = new Model(view);
model.Add(4, 7);
}
}
结果和预期的一样,关键点是它是从视图中打印出来的。
我是视图,我收到这个。结果是 11 按任意键继续.... . .
在现实世界中,该 view
类将是一个完整的UI类,如windows form或wpf等,但它只是被传递给一个它实现的接口。为什么视图被传递为它实现的接口,这会不会被皱眉头?
如果会被皱眉头,这不正是接口的工作吗?在这种情况下,它的派生类毕竟会被期望成为某种UI类来显示消息,而且它还会有很多其他的东西。
我是想了解接口的实际用途,也是想解决一个问题,当偶尔MVVC或MVVM中的模型视图可能要显示消息时,用它来解决。
另一种变化是实现完全的观察者模式,但在我的例子中,模型或视图模型只需要在一个窗口中显示消息(从不在多个窗口中显示),所以将该视图传递给接口在逻辑上是合理的。
我真的不认为这将是一个问题,只要它不影响性能,这是显著的,或者它看起来很奇怪,在项目的后期,当你开始添加越来越多的GUI等。