该关键字protected授予对同一包和子类中的类的访问权限(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html).
现在,每个类都有java.lang.Object超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html).
因此,我得出结论,每个班级都可以访问其java.lang.Object方法,即使它们是protected.
看一下下面的例子:
public class Testclass {
public Object getOne() throws CloneNotSupportedException {
return this.clone();
}
public Object getTwo() throws CloneNotSupportedException {
return ((Object) this).clone();
}
}
虽然getOne()编译很好,但getTwo()给出了
Testclass.java:6: clone() has protected access in java.lang.Object
return ((Object) this).clone();
我既不明白为什么getTwo()不编译也不知道有什么区别(关于java.lang.Objects成员的访问)getOne().
我最近一直在研究一些类文件,我注意到成员变量已经设置为受保护的静态模式,如protected static $ _someVar,并且像static :: $ _ someVar一样访问.
我理解可见性的概念,并且将某些东西设置为受保护的静态将确保成员变量只能在超类或派生类中访问,但是我是否只能在静态方法中访问受保护的静态变量?
谢谢
正如我们从文献中了解到的公共继承一样,子类(子类)的对象也可以被视为基类(超类)的对象.为什么当继承受到保护或私有时,子类的对象不能被视为超类的对象?
使用PHPUnit和PHP> = 5.3,可以测试受保护的方法.stackoverflow的以下页面概述了它的最佳实践:
protected static function callProtectedMethod($name, $classname, $params) {
$class = new ReflectionClass($classname);
$method = $class->getMethod($name);
$method->setAccessible(true);
$obj = new $classname($params);
return $method->invokeArgs($obj, $params);
}
Run Code Online (Sandbox Code Playgroud)
使用PHPUnit可以轻松地在抽象类上测试公共方法.使用上述方法可以轻松地测试正常类上的受保护方法.要测试抽象类上的受保护方法必须以某种方式...
我知道PHPUnit派生抽象类并在具体类中"实现"抽象方法并针对该具体类触发测试 - 但我不知道如何将其集成到上面的方法中以获得callProtectedMethodOnAbstractClasses().
你是怎么做这样的测试的?
PS:问题不在于测试受保护方法的真相(参见:白色,灰色和黑盒测试).测试受保护方法的需要取决于您的测试策略.
那么有关于这个主题的足够信息.例如,这个线程对我来说非常清楚:私有,公共和受保护的继承之间的区别
除了一点; 为什么有用?
我有这个小代码似乎在某种程度上与Ruby的文档相矛盾:
第二个可见性是
protected.当调用受保护的方法时,发送方必须是接收方的子类,或者接收方必须是发送方的子类.否则NoMethodError将提出一个.
class Test
def publico(otro)
otro.prot
end
end
class Hija < Test
protected def prot; end
end
Test.new.publico(Hija.new)
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
NoMethodError:为#publico调用的受保护方法`prot'
我错过了什么?显然,选项"接收者必须是发送者的子类"是不可用的.
我有以下代码:
class Base{
protected val alpha ="Alpha";
protected def sayHello = "Hello";
}
class Derived extends Base{
val base = new Base;
def hello = println(this.alpha +" "+this.sayHello) ;
// def hello = println(base.alpha +" "+base.sayHello) ; // don't compile
}
object MyObj extends App{
val x=new Derived;
x.hello;
}
Run Code Online (Sandbox Code Playgroud)
在课堂上Base,如果我的标签protected与this,代码工作正常; 如果我不标记它this,一切都按预期工作.
是protected和protected[this]相当于Scala呢?如果是,为什么Scala会同时提供?如果没有,它们有何不同?
以下代码符合C++标准吗?
struct B
{
protected:
struct Type {};
};
struct D : B, B::Type
{};
int main()
{
D d;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在Compiler Explorer上试了一下.MSVC(VS 2017 RTW)接受它.gcc(7.3)和clang(6.0.0)拒绝它.
我一直在努力思考从C++中的一些测试代码访问受保护成员函数的最佳方法,这是我的问题:
//in Foo.h
Class Foo
{
protected:
void DoSomething(Data data);
}
//in Blah.h
Class Blah
{
public:
Foo foo;
Data data;
};
//in test code...
Blah blah;
blah.foo.DoSomething(blah.data); // Here's my problem!
Run Code Online (Sandbox Code Playgroud)
到目前为止一些可能的解
欢迎所有建议/见解/意见!
谢谢
我写了以下代码:
public class A
{
protected string Howdy = "Howdy!";
}
public class B : A
{
public void CallHowdy()
{
A a = new A();
Console.WriteLine(a.Howdy);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在VS2010其中导致以下编译错误:
无法通过"A"类型的限定符访问受保护的成员"Aa"; 限定符必须是'B'类型(或从中派生).
这对我来说似乎很不合逻辑 - 为什么我不能protected从类的方法访问类实例的字段,这是从它派生的?
那么,为什么会这样呢?
找到了严格的答案 - http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx