我使用接口引用变量来访问接口上的属性
但除此之外,实现接口的类也有自己的属性。
我无法通过此接口参考访问类属性。
以下是我的问题:
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
}
}
答案 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>