我想将接口传递给以Object作为参数的方法签名,所以我想知道这个问题
public Stream GetViewStream(string viewName, object model, ControllerContext context)
而不是对象我想传递一个接口Imodel,而不修改签名。是否有接口的基类?
同样在新的mvc2中有一种方法可以完全避免使用controllercontext吗?
答案 0 :(得分:3)
我只回答第一个问题 - 为什么所有接口都没有通用的基本接口?
首先,与System.Object案例不同,所有接口都没有通用的预定义基接口。解释这一点会非常有趣。
让我们假设,您可以为系统中的所有接口提供通用接口。这意味着,所有接口都需要强制其实现为该公共基接口提供实现细节。通常,接口用于为其具体实现类提供特定的特殊行为。显然,当你只知道该做什么并且不知道怎么做时,你只想定义一个界面。所以,如果你让所有接口都有一个通用的基本接口,并强制实现期望它们提供如何做的详细信息 - 你为什么要这样做呢?每个班级应该做哪些共同的任务彼此不同?
让我们看看硬币的另一面,为什么我们将System.object作为任何.Net类型的基类 - 很简单,它为您提供了一些方法,可以为任何.Net类型和那些方法实现COMMON它可能因类型而异,因此它们使它成为虚拟的ex:.ToString()
可能没有任何假设 系统范围的接口方法是 所有的虚拟/抽象 的实施方式。
使用Interface的一种常见做法是,为任何类型定义特定行为。就像我有一个IFlyable接口,它将Fly()提供给所有实现IFlyable的类型。这样我可以使用任何Flyable对象,无论其继承层次结构如何。我可以写一个像这样的方法..
public void FlyTheObject(IFlyable flyingObject)
{
flyginObject.Fly();
}
它不需要来自对象的任何东西,而是Fly()方法的实现。
此外,所有接口都将解析为Object,因为无法实例化接口。该对象始终是可以实例化的具体类。这个类可能会也可能不会实现你的接口但是我们知道,任何.Net类型最终都基于System.Object
,所以你可以将实例带入一个对象类型,而不管它是否实现了一个特定的事实。界面与否。
答案 1 :(得分:0)
不,接口没有基类。也没有接口的基本接口。
关于你的第二个问题(部分是第一个问题) - 你究竟想做什么?
答案 2 :(得分:0)
接口没有基类,但您可以传递任何接口变量,例如:
private IEnumerable<int> myInterfaceVariable = new List<int>();
到你的方法,因为根据定义,存储在该变量中的任何东西必须是从接口继承的类的实例 - 因此它必须是一个对象。
以下编译正常:
public class InterfaceAsObject
{
private IEnumerable<int> myInterfaceVariable = new List<int>();
private void CallDoSomething()
{
DoSomething(myInterfaceVariable);
}
private void DoSomething(object input)
{
}
}
答案 3 :(得分:0)
Re 1, 没有基本接口,但是如果我理解正确,只需通过模型参数传递实现IModel
的对象,就可以达到我想要的效果。并将参数强制转换(并检查!)给IModel。我使用'as'并检查null。
如果您不需要完全的灵活性,更好的方法是定义模型参数必须支持的接口。如果特定对象支持派生接口(例如IDerivedModel : IModel
),这也将起作用。
查找有关多态性的教科书。