我有一个界面和一个类见下文:
interface ILastName
{
string LastName();
}
class MyName:ILastName
{
public string FirstName()
{
return "Michael";
}
public string LastName()
{
return "Dutt";
}
}
现在看看我的以下问题和假设 1)
MyName myNameObj=new MyName();
上面的代码行new Myname()
中的有助于创建类的Object,它在堆中分配内存,这意味着堆中存在MyName
的所有方法以进行访问。并且myNameObj
包含对该内存的引用,因此我们可以使用myNameObj
访问所有方法。 (方法名称)。
但是
2)
ILastName obj=new MyName();
在上面的行中,同样的事情发生new Myname()
创建类n的对象,在堆中占用内存,这意味着可以在堆中访问所有可用的方法。
但我们只能访问Interface中存在的那些方法,请参阅以下我可以访问的行
obj.LastName();
但以下是不可能的原因?
obj.FirstName();
为什么呢? obj还持有对MyName
类所占用的内存的引用,与myNameObj
相同,那么我们无法访问接口中不存在的方法吗?
答案 0 :(得分:1)
这是因为变量obj
被输入为ILastName
。
因此,ILastName
的所有属性,方法等都是可见的。他们在那里,但您需要将其转换为正确的类型才能访问它们。
如果您尝试这样做,它会起作用:
MyName obj = new MyName();
这也可行:
var obj = new MyName();
答案 1 :(得分:0)
编译时类型和运行时类型之间存在差异。 obj的运行时类型是MyName,而编译时类型是ILastName。 如果我做了以下怎么办?
class MySecondName:ILastName
{
public string SecondName()
{
return "Michael";
}
public string LastName()
{
return "Dutt";
}
}
ILastName obj;
int i = new Random().Next() % 2;
if (i == 0) obj = new MyName();
else obj = new MySecondName();
没有办法说出obj的类型。所有已知的是它是一个ILastName,因此它所知道的唯一方法是LastName()。
即使只有一个可能的类型,如在您的示例中,编译器也不会查看它。它唯一考虑的是编译时类型。
答案 2 :(得分:0)
只有接口ILastName中的内容可用于obj(ILastName obj = new MyName();)用法。接口只知道方法(字符串LastName();)因此只能访问接口中的内容。
MyName myNameObj = new MyName();是MyName类中的对象,因此它能够访问MyName中的所有方法和变量。
MyName:ILastName显示MyName是ILastName接口的类实现,因此它必须实现ILastName中的所有方法。
MyName myNameObj = new MyName();和ILastName obj = new MyName(); 因此创建对象是分配给它的内存。
希望我的解释能帮助你理解。