当实现它的类有自己的属性时,如何使用接口?

时间:2012-05-23 12:13:40

标签: c# c#-4.0 interface

我使用接口引用变量来访问接口上的属性

但除此之外,实现接口的类也有自己的属性。

我无法通过此接口参考访问类属性。

以下是我的问题:

1)为什么会这样?

2)问题的解决方案是什么?有什么方法可以通过机器只在AC类中访问冷却液功率变量吗? TYPE CAST会起作用吗?

 interface IMachines
{
    #region properties
    int machineID { get; set; }
    static int totalID { get; set; }
    string name { get; set; }
    string make { get; set; }
    int weight { get; set; }
    int cost { get; set; }
    int warranty { get; set; }
    DateTime creationDate { get; set; }
    #endregion

    int generateWarrantyExpiry();
    int searchMachine();
}

public class AC:IMachines
{
    #region ACMembers

    protected int _machineID;
    protected string _name;
    protected int _weight;
    protected string _make;
    protected DateTime _creationDate;
    protected int _warranty;
    protected int _cost;
    public int _coolentPower;

    public int CoolentPower
    {
        get { return _coolentPower; }
        set { _coolentPower = value; }
    }

    #endregion




    #region IMachines Members

    public int machineID
    {
        get { return _machineID; }
        set { _machineID = value; }
    }

    public string name
    {
        get { return _name; }
        set { _name = value; }
    }

    public string make
    {
        get { return _make; }
        set { _make = value; }
    }

    public int weight
    {
        get { return _weight; }
        set { _weight = value; }
    }

    public int cost
    {
        get { return _cost; }
        set { _cost = value; }
    }

    public int warranty
    {
        get { return _warranty; }
        set { _warranty = value; }
    }

    public DateTime creationDate
    {
        get { return _creationDate; }
        set { _creationDate = value; }
    }

    public int searchMachine()
    {
        //Search machine logic to be implemented
return 2
    }

    public void GenerateWarranty()
{
//generate warranty logic to be implemented

}

    #endregion
}

}

7 个答案:

答案 0 :(得分:1)

是的,您可以使用“as”关键字尝试转换为AC类:

IMachines machines = new AC();
(machines as AC).CoolentPower = 3;

答案 1 :(得分:1)

请注意,正如许多回答者所建议的那样,使用强制转换会破坏IMachines界面提供的抽象。

如果您只使用实现该接口的一种类型AC,那么这将有效,但如果您想支持其他类型的IMachines,事情可能会崩溃。

答案 2 :(得分:1)

以这种方式使用Interfaces的一个有趣的事情是能够检查通用变量是否实现了接口。例如,您有一个在较低级别运行的通用函数。如果您获得的对象实现IMachines,请执行特殊操作或其他操作。

public void DOSTUFF (object myobject)
{
    IMachines machine = myobject as IMachines;
    if (machine != null)
    {
        //do something special for IMachine objects
    }

    //the rest of the function that gets run against everything
}

并且是的,要访问未在界面中定义的类的部分,您必须直接转换为该类型而不是使用该接口。

答案 3 :(得分:1)

  

为什么?

接口是合同的声明。你是说实现类型符合该合同。

使用界面访问属性时,您只能访问界面声明的那些属性 - 界面如何“了解”这些属性?它需要“知道”所有实现它的类型以及你的意思。

解决方案是在需要接口抽象时使用接口,并在需要使用类型及其所有已定义属性时使用具体类型。

答案 4 :(得分:0)

有一个解决方案,调用CAST

因此强制转换为类的类实现它来访问inetrface本身不存在的属性/方法。

var machine = (AC)interfaceVar;
machine.CoolentPower

或者,只需使用dynamic

即可
dynamic machine = interfaceVar; //no cast needed ! non need to "know" actual type
machine.CoolentPower

答案 5 :(得分:0)

如果你投射它,你可以访问你的类的属性。

var cool = machine as AC;

答案 6 :(得分:0)

在回答1时 - 因为接口定义了一个类将实现的契约,因此只要契约(即接口)保持不变,就可以更改实现。你要做的是获取不属于合同的属性 - 如果你可以访问你的AC类的属性,你会发生什么,但有人传入了一个实现IMachine的MachineX实例但没有有你的AC类的属性?编译器无法猜测在这样的实例中该做什么,因此你必须明确地告诉它,如果你的机器是AC,那么用它作为AC做一些事情(这就是另一个回答关于它的做法)。 p>