.net中所有接口的基础是什么,就像对象的所有类的基础一样

时间:2010-08-06 10:39:25

标签: asp.net-mvc-2 object interface

我想将接口传递给以Object作为参数的方法签名,所以我想知道这个问题

public Stream GetViewStream(string viewName, object model, ControllerContext context)
  1. 而不是对象我想传递一个接口Imodel,而不修改签名。是否有接口的基类?

  2. 同样在新的mvc2中有一种方法可以完全避免使用controllercontext吗?

4 个答案:

答案 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),这也将起作用。

查找有关多态性的教科书。

相关问题