接口引用如何调用子类方法。
在下面的例子中 接口引用如何访问Test类对象?
interface ITest
{
int add();
}
public class Test : ITest
{
public int add()
{
return 1;
}
public int sub()
{
return -1;
}
}
static void Main(string[] args)
{
ITest t = new Test();
Console.WriteLine((t as Test).sub());
}
-1。
答案 0 :(得分:4)
这一行
Console.WriteLine((t as Test).sub());
将t
别名的任何内容转换为Test
类型。
您知道t
可转换为Test
,因为您为其分配了Test
个实例
ITest t = new Test();
请注意,如果t
的类型无法转换为Test
,
t as Test
将计算为null,随后对.sub()的调用将导致NullReferenceException。
虽然它很少是一个很好的设计选择,但你可以做一些像
这样的事情if (t is Test)
{
Console.WriteLine(((Test)t).sub());
}
else
{
Console.WriteLine("t cannot be converted to type Test");
}
或者
Test myTest = t as Test;
if (myTest != null)
{
Console.WriteLine(myTest.sub());
}
else
{
Console.WriteLine("t cannot be converted to type Test");
}
答案 1 :(得分:2)
因为t
实际上是Test
类的实例。将其存储到接口中并不仅限于接口方法(如果用作接口,那么是,将其类型化为Test
,然后是否)。
类似的例如:
IEnumerable<string> list = new List<string>();
list.Add("MyName"); // --> This won't compile since IEnumerable does not have Add method
(list as List<string>).Add("MyName"); // --> This will compile and execute, since underlying Type actually IS List<string>
但很多时候,当我们使用接口时,我们不知道实际的底层类型,所以这就是为什么这种类型的铸造并不常见。我认为它也被认为是不好的做法,但我不确定。
正如埃里克指出的那样,我们不应该进行这种铸造。这意味着我们的设计存在问题,我们应该考虑重新设计。
答案 2 :(得分:0)
您正在从测试类调用sub()
方法,因此,您得到-1
的结果。请指出您遇到的问题的示例代码,以及您计划收到的内容。