- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
本着精心设计的面向对象的精神,我正在扩展的某个类已将其字段之一标记为 protected 。此类还慷慨地提供了公共(public) setter,但没有 getter。
我正在用一个基类扩展这个类,这个基类又由几个 child 扩展。如何限制我的 child 对 protected 变量的访问,同时仍然能够私下操作它并公开设置它?
请看下面的例子:
public abstract class ThirdPartyClass {
protected Map propertyMap;
public void setPropertyMap(Map propertyMap){
this.propertyMap= propertyMap;
}
// Other methods that use propertyMap.
}
public abstract class MyBaseClass extends ThirdPartyClass{
// Accessor methods for entries in propertyMap.
public getFoo(){
propertyMap.get("Foo");
}
public getBar(){
propertyMap.get("Bar");
}
// etc...
}
public class OneOfManyChildren extends MyBaseClass {
// Should only access propertyMap via methods in MyBaseClass.
}
我已经发现我可以通过在 MyBaseClass
中将字段设置为 private final
来撤销访问权限。然而,这也阻碍了使用父类(super class)提供的 setter。
我能够通过下面的“聪明”来规避该限制,但它也会导致维护同一 map 的两个副本以及一个 O(n) 操作来复制每个元素。
public abstract class MyBaseClass extends ThirdPartyClass{
private final Map propertyMap = new HashMap(); // Revokes access for children.
/** Sets parent & grandparent maps. */
@Override
public final void setPropertyMap(Map propertyMap){
super.setPropertyMap(propertyMap);
this.propertyMap.clear();
this.propertyMap.putAll(propertyMap);
}
}
有没有更好的方法来实现这一点?
注意:这只是真实问题的一个示例:如何在不维护多个副本的情况下限制对 protected 字段的访问?
注意:我也知道,如果首先使用 protected
访问器将字段设置为 private
,这将是一个非-问题。遗憾的是,我无法控制这一点。
注意:需要 IS-A 关系(继承)。
比喻那些误解问题的人:
这类似于祖 parent 有一个 cookies jar ,他们让所有家庭成员和他们家里的任何其他人都可以访问( protected )。一位带着年幼 child 的 parent 走进屋子,出于他们自己的原因,希望阻止他们的 child 恶心地挖 cookies jar 。相反, child 应该向 parent 要一 block 巧克力 cookies ,然后看着它神奇地出现;同样适用于糖 cookies 或奥利奥。他们永远不需要知道 cookie 都存储在同一个 jar 里,或者是否有一个 jar (黑盒子)。如果 jar 属于 parent ,如果可以说服祖 parent 收起 cookies ,或者如果祖 parent 自己不需要访问,那么这很容易实现。除了创建和维护两个相同的 jar 之外,如何限制 child 的访问权限,同时让 parent 和祖 parent 畅通无阻?
最佳答案
这对您来说可能是不可能的,但是如果您可以从 ThirdPartyClass 派生一个接口(interface)并让 ThirdPartyClass 实现它呢?
然后通过委托(delegate)给私有(private)成员 ThirdPartyClassImpl 来实现接口(interface),让 MyBaseClass 充当装饰器。
即
public interface ThirdParty ...
public class ThirdPartyClass implements ThirdParty
public class MyBaseClass implements ThirdParty {
private ThirdParty decorated = new ThirdPartyClass();
public class SubclassOne extends MyBaseClass....
等等
关于java - 远离 child : Removing protected fields from inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21482682/
这个问题在这里已经有了答案: How to make a property protected AND internal in C#? (8 个答案) 关闭 9 年前。 我需要声明一个既受又 内部保
我有以下代码: class Base{ protected val alpha ="Alpha"; protected def sayHello = "Hello"; } class
我正在尝试运行一个宏来创建一个工作正常的pdf。 Excel 文件获得签名后,Excel 文件将自动受到保护。 问题:我的工作表上有一个按钮,需要按下该按钮才能创建 pdf 文档网。然而,这是无法完成
子类需要能够使用种子随机数生成器。 使用的优点和缺点是什么 public abstract class AbstractClass { protected Random rnd; public
我们有两个类(class)(A 和 B)。 A类只能由继承它的类创建(A类)B 类可以由用户创建。 A 类,版本 1 有一个private 数据成员,并且有方法访问 A 类中的数据。 A 类,版本 2
当父类受到保护时,我对继承类的默认构造函数有疑问,在我看来,子类也会有一个默认构造函数受到保护,但事实并非如此。 除了在子类上强制默认构造函数外,还有其他方法可以强制保护默认构造函数吗? C++11
我有一个抽象类,我想在其 protected 构造函数中初始化一个只读字段。我希望这个只读字段在派生类中可用。 按照我将所有字段设为私有(private)并公开属性的习惯,我实现如下: abstrac
我在运行大数据时遇到错误。错误已由以下示例示例解释 加载数据 mdata <- as.matrix(read.table('https://gubox.box.com/shared/static
我在获取 时遇到问题非法访问错误 对于以下示例: 我在名为 arch 的 gradle 模块中声明了一个基类 abstract class BaseClass { protected abst
我相信通过 实现 JSF 应用程序的安全性+ + & 通过使用 是两种不同的方式!?他们是吗? 我尝试通过上述第一种方法(使用 + + )来实现安全性,但发现使用 protected 和不
有没有办法确定以下的二传手能见度差异: public Prop { get; protected set; } protected Prop { get; set; } 使用反射?还是那些与 C# 反
我读了一本关于 OOP 的书,并且关于“ protected ”访问修饰符的示例对我来说很奇怪。 例子总结 这个例子是为了测试“protected”保留字对变量的影响。 ClassA 有 2 个 pr
内部——在集会上公开,在其他地方私有(private)。 protected - 只有派生类可以访问父类成员。 Protected internal - protected OR internal -
我有一个类代表 Wicket 中带有“返回”、“前进”和“取消”按钮的基本页面。但并非所有页面都有所有按钮,例如。 G。第一页明显没有“返回”。 我的想法是定义一个通用的ActionHandler p
在了解到嵌套类是嵌套类的成员并因此可以完全访问嵌套类的成员这一事实后(至少对于 C++11,请参见 here),我在尝试创建嵌套类模板: #include using namespace std;
我刚刚使用了 Resharper,并一直在尝试将字段转换为属性。我希望这些属性受到保护,但 Resharper 不想给我这个选项。相反,只有一个 protected 内部选项。这让我思考。要么某处有一
这是 question 的扩展一个小时前问过。 当覆盖派生类中的虚方法时,我们不能修改访问修饰符。考虑 System.Web.UI 命名空间中的 Control 类 public class Cont
有人可以解释一下 C# 中 protected 和 protected internal 修饰符之间的区别吗?看起来他们的行为是相同的。 最佳答案 “protected internal”访问修饰符是
我想知道下面两行代码之间是否有区别: protected $var = null; protected $var; 我已经看到两者都被使用了,我想知道这是否只是一个偏好问题,(也就是 $var; 将变
我正在尝试使用mockito为“另存为”操作编写单元测试。该操作的一部分是制作并显示一个文件对话框,用户可以在其中输入要保存的文件。选择文件不是我可以自动化的操作,因此我想模拟 FileDialog
我是一名优秀的程序员,十分优秀!