接口变量无法访问所有类方法

时间:2014-06-20 08:38:27

标签: c# asp.net .net

我有一个界面和一个类见下文:

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相同,那么我们无法访问接口中不存在的方法吗?

3 个答案:

答案 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(); 因此创建对象是分配给它的内存。

希望我的解释能帮助你理解。