简要了解接口

时间:2014-03-17 08:22:33

标签: c# asp.net oop interface

我有一个说明setMaster()的界面; 和2个类,我根据场景设置各自的母版页。

我需要了解以下代码的含义:

 Control pageControl = LoadControl(pageControlPath);
 if (pageControl is IVariableMasterPageControl)
 {
     ((IVariableMasterPageControl)pageControl).setMaster();
 }

我的代码:

接口:

interface IVariableMasterPageControl
{
    void setMaster();
}

类:

public class VariableMasterControl1 : System.Web.UI.UserControl, IVariableMasterPageControl
{
    public void setMaster()
    {
        this.Page.MasterPageFile = ("~/ui/" + SiteConfiguration.UIID + "/MasterPageOne.Master");
    }
}

3 个答案:

答案 0 :(得分:2)

您要显示的代码会动态加载UserControl。对LoadControl方法的调用返回类型为Control的实例。这可以是任何可能实现或不实现接口IVariableMasterPageControl的控件。因此,如果要调用setMaster方法,则需要在访问接口控件之前检查控件是否实现了接口。这就是if语句正在做的事情。

is语句检查object is compatible with a given type是否可以转换为该类型。在你的情况下,行

if (pageControl is IVariableMasterPageControl)

检查pageControl是否实现IVariableMasterPageControl,以便它可以在下一行安全地投射它。

由于您之后需要引用该接口,另一种方法是使用as运算符:

Control pageControl = LoadControl(pageControlPath);
var varMasterPageCtrl = pageControl as IVariableMasterPageControl;
if (varMasterPageCtrl != null)
    varMasterPageCtrl.setMaster();

答案 1 :(得分:0)

在我看来,您正在进行自定义ASCX控件,其中一些控件实现了IVariableMasterPageControl接口。如果有问题的控件是否实现了接口,那么您无法理解的代码就是检查。如果是,它将访问控件的方法setMaster() - 显然必须实现。

代码

if (pageControl is IVariableMasterPageControl)

是否进行检查的部分是否检查控件是否实际实现了接口。这也可以通过以下方式完成;

if (pageControl.GetType() == typeof(IVariableMasterPageControl))

请看一下这个链接:How to compare types。可以帮助您比较类型并更深入地理解这个概念。

答案 2 :(得分:0)

在这种情况下,is关键字基本上表示:"如果PageControl的此实例实现了接口IVariableMasterPageControl,则调用接口{{1} } SetMaster()。"

的方法

使用PageControl关键字进行的检查可确保您的对象实际方法is进行调用。您可以遍历一堆SetMaster()个对象,但并不保证所有这些对象都会实现该接口。在没有检查的情况下调用不存在的方法肯定会导致PageControl或者甚至可能调用错误的代码(例如,如果其中一个Exception对象实现另一个恰好也是定义方法PageControl)的接口。