我想知道protectedC#的含义是什么,为什么我们使用它,以及关键字的好处?
例如
protected int currentColorIndex;
请详细说明.
我正在编写一个直接扩展的自定义视图android.view.View.如果我尝试访问字段mScrollX或mScrollY,我看到一个错误,该字段"无法解析或不是字段".android.view.View的源代码有mScrollX,mScrollY和声明的类似变量protected.我的直接子类怎么不能访问其父类的受保护字段?(像ScrollView这样的类显然可以.)
PS我意识到我可以打电话getScrollX(),但我想更新这些字段; 打电话setScroll()有我不想要的副作用.
我想在itms-services链接中传递用户标识和密码,以便可以访问受保护的plist.
为了澄清,在以下链接中,无法直接访问plist,因为访问需要输入用户标识和密码以便可以访问plist.
<a href="itms-services://?action=download-manifest&url=http://example.com/app.plist">
Run Code Online (Sandbox Code Playgroud)
目前上述链接出错
无法连接到example.com
我很少使用继承,但是当我这样做时,我从不使用受保护的属性,因为我认为它打破了继承类的封装.
你使用受保护的属性吗?你用它们做什么的?
忏悔:我只对我的方法使用私人和公众可见度!
我觉得这是件坏事.但是在Rails中它似乎并不是一个问题.
有没有人在Rails中有一个例子,如果不使用受保护的可见性将是一个很大的错误?
我最近发现派生类中的方法只能通过派生类(或其子类之一)的实例访问基类的受保护实例成员:
class Base
{
protected virtual void Member() { }
}
class MyDerived : Base
{
// error CS1540
void Test(Base b) { b.Member(); }
// error CS1540
void Test(YourDerived yd) { yd.Member(); }
// OK
void Test(MyDerived md) { md.Member(); }
// OK
void Test(MySuperDerived msd) { msd.Member(); }
}
class MySuperDerived : MyDerived { }
class YourDerived : Base { }
Run Code Online (Sandbox Code Playgroud)
我设法通过向基类添加静态方法来解决此限制,因为允许Base的方法访问Base.Member,而MyDerived可以调用该静态方法.
不过,我仍然不明白这种限制的原因.我已经看到了几个不同的解释,但他们无法解释为什么仍然允许MyDerived.Test()访问MySuperDerived.Member.
Principled说明:'受保护'意味着它只能被该类及其子类访问.YourDerived 可以覆盖Member(),创建一个只能由YourDerived及其子类访问的新方法.MyDerived无法调用重写的yd.Member()因为它不是YourDerived的子类,并且它不能调用b.Member(),因为b实际上可能是YourDerived的一个实例.
好的,但是为什么MyDerived可以调用msd.Member()?MySuperDerived可以覆盖Member(),并且只有MySuperDerived及其子类才能访问该覆盖,对吧?
直到运行时才知道您是否正在调用被覆盖的成员.当成员是一个字段时,它无论如何都不能被覆盖,但仍然禁止访问.
实用主义解释:其他类可能会添加您的类不了解的不变量,您必须使用它们的公共接口,以便它们可以维护这些不变量.如果MyDerived可以直接访问YourDerived的受保护成员,它可能会破坏这些不变量.
我同样的反对意见适用于此.MyDerived不知道MySuperDerived可能添加的不变量 - 它可能由不同的作者在不同的程序集中定义 - 为什么MyDerived可以直接访问其受保护的成员?
我得到的印象是,这种编译时限制是作为一种错误的尝试来解决一个实际上只能在运行时解决的问题.但也许我错过了一些东西.有没有人有这将通过类型YourDerived或基地的变量让MyDerived访问基地的保护成员造成的,但问题的例子不是 …
我的问题涉及专门的Java,抽象类和受保护数据的使用.我被告知所有数据都应该是私有的,并且仅使用受保护的getter/setter.
现在,我理解我们希望屏蔽数据,使其免受该类临时用户的直接操作,并且公共数据成员通常是一个值得怀疑的做法.我已经看过"Java protected fields vs public getters"(Java protected fields vs public getters),但我仍然怀疑:
protected int i;
Run Code Online (Sandbox Code Playgroud)
在抽象类中比在以下情况更糟糕:
private int i;
protected int geti();
protected void seti(int j);
Run Code Online (Sandbox Code Playgroud)
当抽象类准确地为子类提供父/公共设施时,我只是没有看到缺点,受保护的范围旨在提供对子项的访问,同时保护数据免受临时用户的影响.我在上面提到的问题中指出,大多数答案似乎都解决了为什么数据一般应该是私有而不是公开的问题.我试图将我的问题专门集中在一个抽象的父母中存在的数据,供孩子们使用.我迄今听到的唯一合理的评论是,使用父母受保护的数据(例如,上面的int i)会在子类中留下引用未在子类中声明的变量的代码.参数不太引人注目(参见基类中的Common protected data成员?)您可能希望某天更改访问权限,现在您必须尊重您的界面.这是一个抽象类,旨在100%扩展.
谢谢!特定标题/页面对书籍的引用对于引用"..anyany basic Java programming text ..."更有帮助.
========================================== 10-13-2010
这是关于抽象类的问题,因为它是关于受保护的数据.我觉得令人失望的是,在OOP中数据隐藏是否是一件好事的回答似乎已经转移(答案:是).这里有很多深度涉及抽象类的本质,以及它与常规非final类的区别,以及可能有哪些可能的优点来修复抽象父类中的数据项的名称和类型以供使用儿童班.我认为这里存在创新和更大控制从抽象父类扩展到实现子类的可能性.我担心一般原则,例如数据隐藏的优势,可能成为教条,并抑制创新和新模式和想法的发展.
感谢所有贡献者.
package packageOne;
public class Base
{
protected void display(){
System.out.println("in Base");
}
}
package packageTwo;
public class Derived extends packageOne.Base {
public void show(){
new Base().display(); //this is not working throws compilation error that display() from the type Base is not visible
new Derived().display(); //is working
display(); //is working
}
}
Run Code Online (Sandbox Code Playgroud)
这两个包有两个不同的文件.但为什么会这样呢?
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
Run Code Online (Sandbox Code Playgroud)
public class a {
protected int x;
}
public class b {
b() {
a A=new a();
A.x=9;//why we can access this field ?
}
}
Run Code Online (Sandbox Code Playgroud)
请帮助我了解Java中受保护的具体工作
是否可以使用PHP Mockery模拟受保护的属性?
我得到了一个带有方法的类,我将其称为"a",它在从同一个类的受保护属性中检索的数组上做了一些魔术.
受保护的属性由另一个方法填充b,在同一个类中.
我想a通过模拟受保护的属性来测试方法,所以我不必b首先使用类方法.
这可能吗?如果没有,我应该重构我的代码吗?或者还有其他方法(考虑最佳实践).