一直以为Protected属性的方法就是不能被类实例直接调用而可以被类内的方法或子类的方法
以不指明实例的方式(或者说其实是省略了this指针)来调用的方法。有这个印象是受了private属性的影响,觉得
调用者总是本身才行,protected和private比只不过是增加了继承性,比如调用者还是必须是基类或子类的实例本身,不能新创建一个实例去调用。。。
今天在看ruby的介绍时才发现:
Protected methods can be called both in the same instance and by other instances of the same class and its subclasses.
这里有个重要的差别:other instances...
举个例子:
public class ClassC
{
protected void MethodTwo()
{
}
public void MethodOne()
{
ClassC temp = new ClassC();
temp.MethodTwo();
}
}
main函数里调用ClassC的实例和MethodOne(),省略。
按第一种理解就不可以运行MethodOne方法。而实际上是可以的。无论是c++还是c#。
上述英文定义是从实例的角度出发,用类和scope的角度来说,就是在基类或者子类的scope里都可以调用protected方法,无论调用的主体是基类或子类的实例,是本身的实例还是新构造的实例,这些都无所谓。
其实我觉得作者的定义不准确,instance都是class的应用,instance没有body,啥叫in the same instance? 定义都在class里嘛。
延伸一下,ruby有没有static的类成员我还没学到,但对于c++,protected的定义必须跳出instance的范畴。
因为,对于static的方法来说,根本没有instance的存在。比如:
C++代码:
class ClassC
{
protected :
static void MethodTwo()
{
printf("hi");
}
public :
static void MethodOne()
{
ClassC::MethodTwo();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
ClassC::MethodOne();
return 0;
}
所以用class scope的方法来说明protected的用法是最好的。其实想想自己对这种基本概念仍然有不清楚的地方,直接导致了实际应用中基本不用protected方法。真正了解一个东西,才能更好的使用它啊。
不知道我的下一份工作,能否更多地走回到技术的道路上来。