是否建议将基类的成员变量设置为protected,以便子类可以访问这些变量?或者是否更建议将成员变量设置为private并让子类通过getter和setter获取或设置变量?
如果建议使用getter和setter方法,何时使用受保护的变量?
如果我们将属性定义为属性,public并且在此属性中我们有一个protectedgetter.这是什么意思?如果属性是公共的,为此定义受保护的getter是什么意思?请看下面的代码:
public ISessionFactory SessionFactory
{
protected get { return sessionFactory; }
set { sessionFactory = value; }
}
Run Code Online (Sandbox Code Playgroud) 什么是有效的理由不使用关键字公共,私人,受保护的PHP?
故事:我已经开始了一个项目,其团队在他们的代码中积极使用访问修饰符(甚至明确地"公开"),并想说服我这样做.我总是觉得这种东西在像php这样的动态语言中完全没用,但我意识到我的直觉在技术讨论中几乎不是一个论点.因此,我正在寻找一个可靠,清晰的解释为什么访问修饰符在php中无用(甚至有害).
我知道已经存在一些类似的主题
但是我发布这个有几个原因
TIA
我可以理解为什么有公共和私人访问修饰符,这两个也几乎可以在任何语言中找到.我甚至可以理解为什么可能有一个包修饰符,因为你可能希望你的类(那些紧密相关的类)以某种方式相互交互,这不适合公共交互(例如,因为它取决于知识的class internals,也许是因为它会泄露一个秘密,或者因为它可能随时改变并依赖它会破坏所有现有代码,等等).但是,为什么我想要一个受保护的标识符?别误会我的意思,我知道什么是受保护的意思是,但为什么我希望我的类的子类访问某些实例变量或使用某些方法,只是因为它们是子类,即使它们是不同包的一部分?什么是受保护的真实世界用例?
(并且作为实例变量的参数的性能不计,因为JIT编译器总是可以内联访问器方法,将其调用开销减少到零)
我有一个这样的课:
class Foo
{
public:
Foo()
{
for(int i = 0; i < 10; ++i)
v.push_back(i);
};
const vector<double>& V() const {return v;};
protected:
vector<double>& V() {return v;};
private:
vector<double> v;
};
Run Code Online (Sandbox Code Playgroud)
然后是一段这样的代码:
Foo foo;
for(int i = 0; i < (int) foo.V().size(); ++i)
cout << foo.V().at(i) << endl;
Run Code Online (Sandbox Code Playgroud)
但是,后者引发了一个编译错误,说V()调用是一个受保护的方法,而我只是想从中读取,而不是修改它.
我尝试了以下(但没有成功).
Foo foo;
const vector<double>& test = foo.V();
for(int i = 0; i < (int) test.size(); ++i)
cout << test.at(i) << endl;
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助.
=====
谢谢大家的解释和解决方案!非常感谢!
我有以下Ruby程序:
class Access
def retrieve_public
puts "This is me when public..."
end
private
def retrieve_private
puts "This is me when privtae..."
end
protected
def retrieve_protected
puts "This is me when protected..."
end
end
access = Access.new
access.retrieve_protected
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到以下内容:
accessor.rb:23: protected method `retrieve_protected' called for #<Access:0x3925
758> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)
这是为什么?
谢谢.
多年来我一直在编程,我认为我甚至理解公共,私人和受保护的大部分区别,但这些名称是否只是误导?这些能见度水平只是为了帮助我们避免绊倒自己的脚趾吗?我编写的许多语言似乎都没有强制执行大部分规则,而且我从未听说过黑客入侵系统,因为你的一个变量没有标记为私有.
我很想知道它多年来一直困扰着我.
我看到"快速监视"窗口可以访问所有属性,而不管库中类的访问限制(内部,受保护,私有),即使在完全不同的应用程序,库和命名空间中引用库也是如此.虽然我没有找到使用"反射"访问这些的方法.我特别想"阅读"(注意 - 只是阅读)程序集的内部属性.如果通过设计"内部"如何工作(在同一命名空间外无法访问),这是不可能的,那么VS.NET中的"快速监视"窗口是如何"读取"的呢?
这是我使用的示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestLib
{
public class TestInteralProp
{
internal string PropertyInternal
{
get { return "Internal Property!"; }
}
protected string PropertyProtected
{
get { return "Protected Property!"; }
}
string PropertyPrivate
{
get { return "Private Property!"; }
}
public string PropertyPublic
{
get { return "Public Property!"; }
}
protected internal string PropertyProtectedInternal
{
get { return "Protected Internal Property!"; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我为TestInernalProp类创建一个对象时,我可以在quickwatch中看到所有4个属性 -

当我使用反射访问除公共属性(PropertyPublic)之外的任何这些,我得到一个空引用异常. …
这是我的代码的一部分:
package com.admobsdk_dfp_handler;
import com.google.ads.*;
import com.google.ads.doubleclick.*;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.widget.RelativeLayout;
public class AdMobSDK_DFP_Handler extends Activity {
private DfpAdView adView;
private static final String adUnitId = "/7732/test_portal7/android_app1_test_portal7/top_banner_non_sdk_application_android_app1_test_portal7";
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
public void run() {
adView.loadAd(new AdRequest());
handler.postDelayed(this, 5000);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ad_mob_sdk__dfp__handler);
adView = new DfpAdView(this, AdSize.BANNER, adUnitId);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.mainLayout);
layout.addView(adView);
adView.loadAd(new AdRequest());
};
@Override …Run Code Online (Sandbox Code Playgroud) 我明白要编写你使用的python模块私有/受保护的函数
def _func():
...
Run Code Online (Sandbox Code Playgroud)
但我有一个具有专门覆盖的对象层次结构.另外我想隐藏内部实现(因为它不适合外部使用,因此我希望能够在不破坏代码的情况下改进它,而不是我认为除了我之外任何人都会使用它).如果我使用
class Paragraph(Tag):
def _method(self):
...
Run Code Online (Sandbox Code Playgroud)
并尝试从另一个类中调用_method,该类继承Tag IntelliJ IDEA(可能还有pylint /其他检查器)也会给我一个警告.有没有什么办法解决这一问题?
我的用例是一组markdown标记对象,用于生成类似"Tree"的结构,可以将其转换为正确的markdown字符串.每个标签覆盖一个受保护的方法本身以及它所包含的标签和一些覆盖变换的方法来检查子标签是否有效(例如,没有嵌套加粗).只有顶级标记上下文具有转换树的公共方法.
编辑:
IntelliJ IDEA警告:
访问类_method的受保护成员