.NET中的"protected"和"protected internal"修饰符有什么区别?
变量,方法和类可以获得各种安全级别.从我的C#经验来看,有:
公共
内部
受
保护的内部
私人
现在,我理解使用方法和类私有,或内部或受保护,但变量怎么样?即使我将变量设为私有,我也可以使用Property从不同的类中调用它.
我一直认为属性是最佳实践.因此,如果我可以使用它,我不需要通过实例直接调用变量.
有没有理由不将变量设为私有?
编辑:我看到有些人谈论属性,好像它们只不过是美化的公共变量
快速提醒:公共变量只返回它们的值.有了属性,您可以做更多.例如:
public int AmountOfBooks{
get {
//code to check certain conditions
//maybe trigger an event while we're at it.
//and a few conditionals.
return this.amountOfBooks;
}
set {
//a few conditionals
//maybe trigger an event
this.amountOfBooks = value;
//and I can do even more... I think, never tried this.
}
}
Run Code Online (Sandbox Code Playgroud)
那些读过我个人资料的人都知道我是学生.使用属性作为"荣耀的公共变量"是我看到许多同学所做的事情.告诉他们可以做到这一点时最常见的回答是:"这是允许的吗?"
PHP5中是否有一种方法只允许某个类或一组类调用特定的函数?例如,假设我有三个类("Foo","Bar"和"Baz"),都有类似命名的方法,我希望Bar能够调用Foo::foo()但拒绝Baz 进行调用的能力:
class Foo {
static function foo() { print "foo"; }
}
class Bar {
static function bar() { Foo::foo(); print "bar"; } // Should work
}
class Baz {
static function baz() { Foo::foo; print "baz"; } // Should fail
}
Foo::foo(); // Should also failRun Code Online (Sandbox Code Playgroud)
在Foo,Bar和Baz之间不一定存在继承,因此使用protected或类似的修饰符将无济于事; 然而,这些方法不一定是静态的(为了简化示例,我在这里做了它们).
我可以理解为什么有公共和私人访问修饰符,这两个也几乎可以在任何语言中找到.我甚至可以理解为什么可能有一个包修饰符,因为你可能希望你的类(那些紧密相关的类)以某种方式相互交互,这不适合公共交互(例如,因为它取决于知识的class internals,也许是因为它会泄露一个秘密,或者因为它可能随时改变并依赖它会破坏所有现有代码,等等).但是,为什么我想要一个受保护的标识符?别误会我的意思,我知道什么是受保护的意思是,但为什么我希望我的类的子类访问某些实例变量或使用某些方法,只是因为它们是子类,即使它们是不同包的一部分?什么是受保护的真实世界用例?
(并且作为实例变量的参数的性能不计,因为JIT编译器总是可以内联访问器方法,将其调用开销减少到零)
这是我无法理解的.
在java.lang.Object所述clone()与定义protected改性剂.根据定义,它可以通过名称在其自己的类定义中访问,通过名称在从它派生的任何类中,并通过名称在同一个包中的任何类的定义中.
这里的Sample类在另一个包中,显然它无法clone()从Object类中访问.但是,由于Sample隐含地来源Object,为什么它无法访问它?该定义并未说明它必须满足两个条件(在同一个包内并且也是一个子类).
public class Sample {
public Object foo() throws CloneNotSupportedException {
...
return someObject.clone();
}
}
Run Code Online (Sandbox Code Playgroud) 我知道你可以做到这一点
public String<T> Get { get; private set; }
Run Code Online (Sandbox Code Playgroud)
问题是我希望set方法可以从同一DLL中的不同类访问(即:internal)
这可能吗?
我想从提供此受保护方法的类的子类中调用另一个实例的受保护方法.请参阅以下示例:
public class Nano {
protected void computeSize() {
}
}
public class NanoContainer extends Nano {
protected ArrayList<Nano> children;
}
public class SomeOtherNode extends NanoContainer {
// {Nano} Overrides
protected void computeSize() {
for (Nano child: children) {
child.computeSize(); // << computeSize() has protected access in nanolay.Nano
}
}
}
Run Code Online (Sandbox Code Playgroud)
javac告诉我computeSize() has protected access in Nano.我看不出这个的原因(我以为我已经在其他一些代码中这样做了).我想保护这种方法,我该怎么办?
javac version "1.7.0_09"
Run Code Online (Sandbox Code Playgroud)
我想提供一个精简版本,但我没有想到这样的事实,即这些类位于不同的包中.
nanolay.Node
nanolay.NanoContainer
nanogui.SomeOtherNode
Run Code Online (Sandbox Code Playgroud) 所以private基类中的成员也在继承的类中但不能访问它,对吧?
它们实际上是在分配给继承对象的内存中吗?
在下面的代码中,构造函数的Child可见性降低public了private,这是允许的.继承的方法(例如)test()不能降低可见性.为什么Java以这种方式运行?
class Parent {
public Parent(){}
public void test()
{
System.out.print("parent test executed!");
}
}
class Child extends Parent{
private Child(){}
private void test(){
System.out.print("child test executed!");
}
}
Run Code Online (Sandbox Code Playgroud) 在Web应用程序的范围内,将方法的可访问性声明为publicvs是internal什么意思?
Web应用程序通常包含仅在应用程序内部使用的方法。例如,电子商务网站可能包含一种检索用户的订单历史记录的方法。遵循以下原则:
public List<Orders> RetrieveOrders() {
//code goes here
}
Run Code Online (Sandbox Code Playgroud)
如果此方法包含在类库中,则publicand internal访问修饰符的含义非常简单;公共方法可以在库本身之外访问,而内部方法则不能。
Web应用程序在实际应用上有什么区别吗?
编辑:我的问题已被建议与“ 公共”,“私人”,“受保护”和“无”之间有什么区别?。我不要求解释访问修饰符。我要问的是,网站上的方法上的访问修饰符是否有任何意义。
access-modifiers ×10
c# ×3
java ×3
oop ×3
inheritance ×2
methods ×2
protected ×2
.net ×1
asp.net ×1
asp.net-mvc ×1
c++ ×1
clone ×1
constructor ×1
internal ×1
packages ×1
php ×1
properties ×1
restriction ×1
subclass ×1
variables ×1