数据抽象和信息隐藏有什么区别吗?经过这个链接中的所有答案后,我更加困惑. 抽象VS信息隐藏VS封装 无法找到任何区别.是否只是我们可以将一个(信息隐藏)作为目标而另一个(抽象)作为一个过程?但这对我来说并不是令人满意的.此外,我得到封装是实现抽象过程的技术我在这里吗?请解释确切的区别.
在Java中的程序运行之间存储数据的最佳方法是什么?我已经知道你可以使用文本文件并以这种方式存储信息,但我想知道是否有更好的方法来存储程序运行之间由程序生成的信息.
此外,有没有办法做到这一点,以保持信息安全?具体来说,我想让最终用户无法访问它.
可能重复:
C++中struct和class之间有什么区别
http://www.cplusplus.com/reference/std/typeinfo/type_info/
我想我的"老师"并没有告诉我很多关于C++中struct和classes之间的区别.
我在其他一些问题中读到有关继承的问题,结构默认是公共的...我也猜测struct没有构造函数/析构函数...
那么其他的差异呢?他们这么重要吗?
在谈到私有/受保护的属性/方法时,它们在运行时是不可访问的,只是因为编译器在编译时告诉它并报告错误,对吧?然后将这些功能与类进行比较,"信息隐藏"真正为程序员带来了什么?是否在这里,当有人重用该类时,这个人不会滥用该类,因为编译器会报告私有/受保护的东西?
我仍然为信息隐藏的真正目的而苦苦挣扎,它仍然希望在我的脑海中发出声音,因为它为程序带来更多安全性,意味着更少的安全漏洞,但我真的很困惑这种设计在语言中的目标...... (而且我不打算以任何方式反对C++,我只是想了解在什么情况下这个功能可能有趣或不;如果不是,那不是问题,但我只是想知道...).
这个问题解决了同样的问题,但我不太明白这是如何满足下面(看似)矛盾的情况.
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
说"子类不继承其父类的私有成员".
这意味着它既不继承私有实例变量也不继承私有方法?
但是,如果从父级继承公共访问器方法,它是如何工作的?它返回一个它不知道存在的实例变量?
此外,我的计算机科学书籍(Baron的AP计算机科学A)对一个问题的正确答案是:"(子类)从(超类)继承所有私有实例变量和公共访问器方法."
这不是收缩到oracle的教程吗?
谢谢你的帮助
我试图说服一位同事,一个函数应该将接口作为参数,而不是对象本身.我认为小对象可以很好地传递,但对于大对象,我会给它们一个接口,只是通过i/f,而不是整个事情.
请注意,只会出现其中一个大类 - i/f永远不会用于其他对象.这仅仅是为了隐藏对象的实现.
你是否同意将大型课程分成界面是一种好习惯?
这样做有什么不利之处吗?
例:
public interface class IVeryLargeClass
{
void DoSomething();
...
};
public ref class VeryLargeClass : public IVeryLargeClass
{
public:
virtual void DoSomething() { ... }
...
};
public ref class AnotherClass
{
public:
AnotherClass(VeryLargeClass^ vlc) { vlc->DoSomething(); }
// OR
AnotherClass(IVeryLargeClass^ vlc) { vlc->DoSomething(); }
};
Run Code Online (Sandbox Code Playgroud) language-agnostic oop parameters information-hiding interface
我通常认为全局范围是一个总是可以从任何地方访问的命名空间.我想知道理论上是否有可能完全隐藏全球范围.例如,假设我们有一些我们想要的代码eval
(在浏览器的控制台中):
var code =
"console.log(this); " + // access the global object directly
"console.log(window); " + // access the global object as the window object
"newGlobalVar = 42; "; // implicitly create global object
eval(code);
Run Code Online (Sandbox Code Playgroud)
通过包装eval
调用,this
并window
可以从隐藏code
:
(function (window) { eval(code); }).call({});
Run Code Online (Sandbox Code Playgroud)
但我无法阻止code
隐式创建全局变量.有可能吗?我不想用这些东西,我只是好奇.
在我的 Swift 代码中,我经常使用 private 修饰符来限制辅助类的可见性。例如,在一个文件中,我将有 aGridController
和 a GridControllerModel
。
(GridController
UI)应该可供应用程序的其余部分访问,但模型类完全是内部的,并且永远不应该被应用程序的其余部分访问。
我可以在 Swift 中通过创建两个类private
并将它们保存在同一个文件中来解决这个问题。但随着班级规模的扩大,这会变得很笨拙。我想做的是将每个类保存在一个单独的文件中(为了编程方便),但阻止对模型类的任何访问GridController
(为了信息隐藏的目的)。
在 Swift 中有什么办法可以做到这一点吗?
过程(或函数,模块等)设计中有哪些常见的最佳实践,用于平衡信息隐藏的需求和过程接口中的适当抽象级别以及引入隐藏依赖项所固有的问题?
更具体地说,假设我编写了一个名为getEmployeePhoneNbr(employeeId)的过程.在内部,通过查询从employeeId键入的数据库表来实现该过程.我想隐藏这些实现细节,但现在该过程依赖于外部文件,如果环境发生变化则会阻碍其使用.
只要程序使用外部资源(文件,数据库等),就会发生同样的情况.以某种方式在程序中硬编码该资源的使用感觉是错误的,但我不确定替代方案是什么.
请注意,我不是使用面向对象的语言; 在可能的范围内,我最感兴趣的是那些广泛适用于任何类型语言的答案.
谢谢,马特
我想要一个类型A,它将隐藏的数据输出到类型为T的对象,但是隐藏其他人的数据.我的C++编译器碰巧是GCC 4.4,但这并不重要.为什么这不起作用?
#include <iostream>
template <class T> class A {
private:
int n1;
public:
friend class T;
A(const int n0 = 0) : n1(n0) {}
};
class B {
public:
int f(const A<B> a) const { return a.n1; }
B() {}
};
int main() {
const A<B> a(5);
const B b;
const int m = b.f(a);
std::cout << m << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这样可以正常工作,除了它无法隐藏数据:
#include <iostream>
template <class T> class A {
private:
int n1; …
Run Code Online (Sandbox Code Playgroud) 我经常听到人们说序列化破坏了封装,并且通过提供自定义序列化可以在一定程度上最小化这种封装的损失。有人可以提供一个具体的例子来证明默认序列化导致的封装损失是合理的,以及如何通过采用自定义序列化来最小化这种损失?
我将这个问题标记为与 Java 相关,但答案可能与语言无关,因为我认为这是跨平台和语言的常见问题。
java serialization encapsulation information-hiding deserialization
java ×3
oop ×3
abstraction ×2
c++ ×2
inheritance ×2
class ×1
eval ×1
friend ×1
interface ×1
javascript ×1
parameters ×1
storage ×1
struct ×1
swift ×1
templates ×1