封装是隐藏数据.我想在这里听到一些非常有趣的答案.
private当我们已经public为变量声明setter方法时,保持变量的背后有什么意义?
我理解封装的用法,但是当我们将setter作为public时,保持变量的背后是什么private,我们可以直接使用public访问修饰符
是因为我们不希望其他人知道我们在后端存储数据或管理数据的确切方式吗?
我想创建一个继承自另一个类的类,该类位于不同的文件中.
例如:
Class1.swift
class Class1
{
protected var
//Do Stuff
}
Run Code Online (Sandbox Code Playgroud)
Class2.swift
class Class2:Class1
{
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在swift中有一个'保护'变量/函数?
当我声明一个私有变量/函数时,我只能在该类中使用它.如果我使用'fileprivate',我的其他类必须在保存文件中作为Class1.我想要做的是将我的类保存在seporate文件中,并使用Xcode中的Groups来了解哪个类属于哪个类别.
我正在考试这StringTokenizer.java门课,脑海里浮现出几个问题.
我注意到其他类使用的公共方法调用了一些完成所有工作的私有方法.现在,我知道OOD的原则之一就是尽可能多地私有化并隐藏所有实现细节.我不确定我是否完全理解这背后的逻辑.
我理解,将字段设为私有以防止将无效值存储在其中非常重要(这只是众多原因之一).然而,当谈到私人方法时,我不确定它们为何如此重要.
例如,在StringTokenizer类的情况下,我们不能只将所有实现代码放在公共方法中吗?它如何对使用这些方法的类产生影响,因为这些方法的API(即调用这些公共方法的规则)将保持不变?我能想到为什么私有方法有用的唯一原因是它可以帮助你编写重复的代码.例如,如果所有公共方法都做了同样的事情,那么您可以声明一个执行此任务的私有方法,并且可以由公共方法使用.
其他问题,在私有方法中编写实现而不是公共方法有什么好处?
这是一个小例子:
public class Sum{
private int sum(int a, int b){
return a+b;
}
public int getSum(int a, int b){
return sum(a,b);
}
}
Run Code Online (Sandbox Code Playgroud)
VS ...
public class Sum{
public int getSum(int a, int b){
return a+b;
}
}
Run Code Online (Sandbox Code Playgroud)
第一个样本如何更有益?
java encapsulation private-methods stringtokenizer public-method
根据AngularJS的教程,控制器函数仅位于全局范围内.
http://docs.angularjs.org/tutorial/step_04
控制器功能本身是否自动被解析为封装范围,还是它们居住在全球范围内?我知道他们传递了对自己的$ scope的引用,但看起来这个函数本身只是坐在全局范围内.显然,这可能会导致问题,我已经通过经验和教育来学习封装.此外,如果他们确实居住在全球范围内,那么将它们封装在要引用的对象中是不是最佳实践:
Object.functionName();
Run Code Online (Sandbox Code Playgroud)
而不是这个:
functionName();
Run Code Online (Sandbox Code Playgroud)
以防止全球范围内的污染(即重写功能等)发生的问题.
class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码在C#中编译,并且在PHP中等效,但有人可以解释为什么otherTestClass._privateString可以在这里更改?
我认为类的实例在任何情况下都不应该能够更改私有成员变量,并且尝试访问otherTestClass._privateString会因"保护级别"错误而导致"无法访问".
但事实并非如此,那么为什么在自己的类中实例化一个对象可以让你访问私有成员呢?如果它,这不会破坏封装到一定程度?还是我错过了一些明显的东西?
Edit - Thanks for the answers and comments. To clarify, I'm also interested in knowing if being able to do this is regarded as a positive feature, or if it's a necessary tradeoff for better compile-time checking/code clarity/because most other languages do it that way or whatever. It seems to me …
简单地阅读上面的文章我发现getter和setter是糟糕的OO设计,应该避免它们反对Encapsulation和Data Hiding.在这种情况下,如何在创建对象时避免它,以及如何将对象模型对象考虑在内.
如果需要吸气剂或固定剂,可以使用其他替代品吗?
谢谢.
如果我理解正确,根据Douglas Crockford http://javascript.crockford.com/private.html,"特权"方法类似于我们所知的"公共"方法.而"公共"方法则有点不同.
这是我理解的方式:
"Privileged"方法可以访问私有变量,因为它是在定义其余私有变量时在闭包内定义的.
var C = function(){
var private;
this.privilegedMethod = function(){
/* blah blah */
};
}
var cObj = new C();
Run Code Online (Sandbox Code Playgroud)"公共"方法是通过原型添加到对象本身之外的对象的方法.
var C = function(){
/* blah blah */
}
C.prototype.publicMethod = function(){
/* blah blah */
};
var cObj = new C();
Run Code Online (Sandbox Code Playgroud)我发现这些"特权"和"公共"的定义非常令人困惑.我认为"特权"方法只不过是实际上是一种公共方法,正如我们从面向对象编程中所知道的那样.我认为"公共"方法应该被命名为其他方法.如果您考虑它,它是一种奇怪的函数类型,它是对象的成员但它不能访问任何其他私有变量,这意味着它不会对封装有所贡献.它几乎就像是对象的独立辅助方法.
所以我想知道道格拉斯·克罗克福德为什么会提出这些令人困惑的条款呢?为什么javascript社区采用这些术语?或者如果我对某事有误,请纠正我.
我有一个包含许多静态方法的类.每个人都必须调用一个常用方法,但我试图不暴露后一种方法.将其设为私有只允许从类的自己的实例访问?受保护似乎不会解决这里的问题.
如何隐藏do_calc在静态上下文中被外部调用?(让它可以从前两个静态方法调用.)
class Foo
def self.bar
do_calc()
end
def self.baz
do_calc()
end
def self.do_calc
end
end
Run Code Online (Sandbox Code Playgroud) 受到我见过的各种架构相关问题的启发......
如果存储过程和表都在同一模式中,则所有权链接允许我对存储过程进行GRANT EXECUTE,而不对我使用的表具有显式权限.
如果我们使用单独的模式,那么我必须在不同的模式表上显式GRANT XXX.所有权链接示例证明了这一点.这意味着存储的proc执行用户可以直接读/写表.
这就像直接访问类中的实例变量一样,绕过getter/setter,打破封装.
我们还使用行级安全性来限制某人看到的内容,并将其应用于存储过程.
那么,我们如何维护模式分离并防止直接表访问?
当然,如果您使用ORM或不使用存储过程,则该问题将不适用.但我不会问我是否应该使用ORM或存储过程,以防有人觉得需要启发我...
编辑,例如
CREATE USER OwnsMultiSchema WITHOUT LOGIN
GO
CREATE SCHEMA MultiSchema1 AUTHORIZATION OwnsMultiSchema
GO
CREATE SCHEMA MultiSchema2 AUTHORIZATION OwnsMultiSchema
GO
CREATE USER OwnsOtherSchema WITHOUT LOGIN
GO
CREATE SCHEMA OtherSchema AUTHORIZATION OwnsOtherSchema
GO
CREATE TABLE MultiSchema1.T1 (foo int)
GO
CREATE TABLE MultiSchema2.T2 (foo int)
GO
CREATE TABLE OtherSchema.TA (foo int)
GO
CREATE PROC MultiSchema1.P1
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
EXEC …Run Code Online (Sandbox Code Playgroud) permissions schema encapsulation sql-server-2005 sql-server-2008
我一直在使用C#一段时间,回到C++是一件令人头疼的问题.我试图从C#获得我的一些实践与C++,但我发现了一些阻力,我很乐意接受你的帮助.
我想为这样的类公开一个迭代器:
template <class T>
class MyContainer
{
public:
// Here is the problem:
// typedef for MyIterator without exposing std::vector publicly?
MyIterator Begin() { return mHiddenContainerImpl.begin(); }
MyIterator End() { return mHiddenContainerImpl.end(); }
private:
std::vector<T> mHiddenContainerImpl;
};
Run Code Online (Sandbox Code Playgroud)
我在尝试一些不是问题的东西吗?我应该只是输入std :: vector <T> :: iterator吗?我希望只依赖于迭代器,而不是实现容器......