我知道,Python中没有'真正的'私有/受保护方法.这种方法并不意味着隐藏任何东西; 我只是想了解Python的作用.
class Parent(object):
def _protected(self):
pass
def __private(self):
pass
class Child(Parent):
def foo(self):
self._protected() # This works
def bar(self):
self.__private() # This doesn't work, I get a AttributeError:
# 'Child' object has no attribute '_Child__private'
Run Code Online (Sandbox Code Playgroud)
那么,这种行为是否意味着,"受保护"方法将被继承,但"私有"根本不会被继承?
或者我错过了什么?
刚看到一个教程说:
Class Dog
{
private string Name;
}
Class SuperDog:Dog
{
private string Mood;
}
Run Code Online (Sandbox Code Playgroud)
然后有一个UML显示SuperDog也会继承Name.我试过但似乎只有公共成员才能继承.至少我无法访问Name,除非它被声明为public.
一般来说,将私有类声明为静态是否有任何好处?
在什么情况下我想使用以下哪一个而不是另一个?
private static class Foo
{
...
}
Run Code Online (Sandbox Code Playgroud)
VS
private class Foo
{
...
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个无法从外部访问的实例变量.在objective-c中有可能是这样的吗?我记得Apple有私有变量和类似的东西,但如果人们知道它们,他们就可以使用它们.Apple称之为"私有API",但显然其他人可以访问那些东西,如果他们发现那里有什么.
到目前为止,我认为像这样的东西创建了一个私有实例变量:
@interface MyClass : NSObject {
CGFloat weight;
}
Run Code Online (Sandbox Code Playgroud)
没有@property,没有@synthesize,只是上面的声明.
另外我知道Apple添加了一个_inFrontOfTheirPrivateInstanceVariables,但他们说某些地方他们不喜欢看到其他人这样做,因为他们可能会在执行此操作时覆盖意外隐藏的实例变量.
这里的诀窍是什么?
我已经阅读了几篇关于此的文章,我只是想看看我是否理解这一点:
如果您使用私有API,Apple将拒绝您的应用...
"私有API"和"非私有API"之间的主要区别是什么?
"非私有"API是否仅由Apple提供和验证的API?
API不仅仅是一种与Framework交互的方式,而Framework只是一组人们可以用于琐碎目的的封装类/头文件吗?
这不意味着我不能在我的应用程序中重复使用任何人的代码(Apple除外)吗?
如果这是真的,那么每当程序员制作他或她自己的自定义类和方法时,他是否只是为了他的特定目的而在技术上设计一个迷你框架?那么这不意味着他正在使用自己的私有API吗?
使用别人的类/方法和我的类/方法之间的区别甚至是什么,他们怎么能分辨出差异,为什么这会成为一个问题呢?
我对此的理解听起来很荒谬,并且不相信我理解"私有API"是正确的.我确实读到它是为了防止API中的任何更改可能导致您的应用程序功能失常.这是否意味着API在运行时链接(与编译时相反),并且可以在您不知情的情况下自动更新?(看,我最初认为API /框架在你编译的时候就是一成不变的,也许这就是我错的地方)
有人可以帮帮我吗?我对这个政策感到很困惑.谢谢!
可能重复:
为什么要使用getter和setter?
制作方法来访问类中的私有变量而不是将变量公开是否有任何优势?
例如,第二种情况比第一种情况好吗?
//Case 1
public class Shoe{
public int size;
}
//Case 2
public class Shoe{
private int size;
public int getSize(){
return size;
}
public void setSize(int sz){
size = sz;
}
}
Run Code Online (Sandbox Code Playgroud) 在Java中,它教导变量应保持私有以实现更好的封装,但静态常量呢?这个:
public static final int FOO = 5;
Run Code Online (Sandbox Code Playgroud)
结果与此相当:
private static final int FOO = 5;
...
public static getFoo() { return FOO; }
Run Code Online (Sandbox Code Playgroud)
但哪种更好的做法?
为什么C++有public成员,任何人都可以调用和friend声明所有 private成员公开给定的外部类或方法,但没有提供语法将特定成员暴露给给定的调用者?
我想表达一些例程的接口,这些例程只能由已知的调用者调用,而不必让那些调用者完全访问所有的私有,这感觉是一个合理的想法.我能想出的最好的(下面)和其他人的建议到目前为止围绕着成语/不同间接性的模式,我真的只想要一种方法来获得单一的,简单的类定义,明确指出哪些来电者(比我更细粒度),我的孩子,或绝对任何人)可以访问哪些成员.表达以下概念的最佳方式是什么?
// Can I grant Y::usesX(...) selective X::restricted(...) access more cleanly?
void Y::usesX(int n, X *x, int m) {
X::AttorneyY::restricted(*x, n);
}
struct X {
class AttorneyY; // Proxies restricted state to part or all of Y.
private:
void restricted(int); // Something preferably selectively available.
friend class AttorneyY; // Give trusted member class private access.
int personal_; // Truly private state ... …Run Code Online (Sandbox Code Playgroud) 我应该为私有或受保护的方法编写JavaDoc 吗?私有变量怎么样?
我在Java书上看到了类示例,私有变量是JavaDoc.所以我无法理解JavaDoc 私有(或受保护)方法是否是一个好习惯.
在 TypeScript 3.8+ 中,使用private关键字将成员标记为私有有什么区别:
class PrivateKeywordClass {
private value = 1;
}
Run Code Online (Sandbox Code Playgroud)
并使用为 JavaScript 提议的#私有字段:
class PrivateFieldClass {
#value = 1;
}
Run Code Online (Sandbox Code Playgroud)
我应该更喜欢一个吗?
private ×10
java ×4
class ×3
inheritance ×2
methods ×2
protected ×2
public ×2
static ×2
api ×1
c# ×1
c++ ×1
class-fields ×1
final ×1
frameworks ×1
friend ×1
ios ×1
iphone ×1
javadoc ×1
objective-c ×1
python ×1
typescript ×1
visibility ×1