m_MAX和ask()由run()使用,但不应该是公共的.怎么能/应该这样做?
#include <vector>
class Q {
public:
static int const m_MAX=17;
int ask(){return 4;}
};
class UI {
private:
std::vector<Q*> m_list;
public:
void add(Q* a_q){m_list.push_back(a_q);}
int run(){return Q::m_MAX==m_list[0]->ask();}
};
int main()
{
UI ui;
ui.add(new Q);
ui.add(new Q);
int status = ui.run();
}
Run Code Online (Sandbox Code Playgroud) 我对封装有点困惑.一般(或在Obj-C中),它是指分离接口/实现还是暗示通过方法访问ivars?
请澄清.谢谢.
大家问候......
如果我有以下界面:
interface IMyInterface
{
int property { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以下实施:
class MyClass : IMyInterface
{
// anything
}
Run Code Online (Sandbox Code Playgroud)
如何隐藏set属性的方法MyClass...换句话说,我不希望公开的set方法property,这可能吗?
使用抽象类很容易:
abstract class IMyInterface
{
int property { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,我只可能set在property实现上述的抽象类的类内...
我有一个文件SiteMinder.CS在App_code这里我设置了UserID谁访问的网页
public class SiteMinder : IHttpModule
{
public string UserID { get; set; }
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(Application_PreRequestHandler);
}
private void Application_PreRequestHandler(Object source, EventArgs e)
{
if (HttpContext.Current.Request.Headers != null)
{
NameValueCollection coll = HttpContext.Current.Request.Headers;
UserID = coll["uid"]; // Doesn't have NULL value
}
}
}
Run Code Online (Sandbox Code Playgroud)
在另一个网页UserDetails.aspx.cs文件中,我正在尝试访问它,UserID但它NULL有价值.
public partial class UserDetails : System.Web.UI.Page
{
protected string SessionUser { get; set; }
protected void …Run Code Online (Sandbox Code Playgroud) 在我的 CS 课程中,我只是在学习课程和 OOP。
因此,当您创建一个类时,您会初始化一定数量的私有变量。
我知道您将它们设为私有,因为如果它们是公开的,它们将很容易更改并可能导致很多错误。
所以我们使用 get 和 set 方法来改变变量。但这再次使变量很容易改变,对吗?那么首先将它们设为私有有什么意义呢?
我正在使用大型代码库,并且有许多公开定义的变量.不幸的是,访问这些变量的功能已经改变,这个新功能最好由公共访问器和私有实例变量封装.
所以,我正在努力做出这一改变.为此,我计划将每个公共属性设为私有,然后创建访问器.但是,我不想更改任何访问旧公共属性的代码.例如:
将公共属性更改为私有后,我有以下类:
class Test {
private:
int item = 5;
public:
int GetItem() {
return item;
};
void SetItem(int new_item) {
item = new_item;
};
};
Run Code Online (Sandbox Code Playgroud)
在过去,"item"曾经是该类的公共属性,它通过以下方式访问:
Test* t = new Test();
int item = t->item;
Run Code Online (Sandbox Code Playgroud)
现在,我需要在检索"项目"的方式中添加新功能.例如:
int GetItem() {
// Some complicated code which changes "item"
return item;
};
Run Code Online (Sandbox Code Playgroud)
我怎样才能保持相同的语法:
int item = t->item;
Run Code Online (Sandbox Code Playgroud)
但实际上这有效:
int item = t->GetItem();
Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏!
我看到它的方式,在OOP中,公共接口的一个角色是确保对象始终处于有效状态(这是您不能memcpy使用非pod类型的一个重要原因).例如,一个非常基本的,迂腐的例子:(请忽略类似java的set/get):
class Restricted {
protected:
int a;
public:
Restricted() : a{0} {}
// always returns a non-negative number
auto get() const -> int {
return a;
}
auto set(int pa) -> void {
if (pa < 0)
a = 0;
else
a = pa;
}
auto do_something() {
// here I code with the assumption that
// a is not negative
}
};
Run Code Online (Sandbox Code Playgroud)
在此示例中,类Restricted的建模方式使Restricted对象始终保持非负数.这就是我为其定义有效状态的方法Restricted.通过查看界面我可以说Restricted ::get总会返回一个非负数.用户无法Restricted持有负数.
a受保护,让选项轻松扩展类.所以让我们扩展Restricted …
private int someInt;
public int GetSomeInt()
{
return someInt;
}
Run Code Online (Sandbox Code Playgroud)
我什么时候可以使用上面的代码而不是下面的代码?
public int SomeInt { get; set; }
Run Code Online (Sandbox Code Playgroud)
我被告知要始终封装所有变量而不是将它们声明为公共变量,而自动实现似乎就是这样做的.
当字段被声明为公共时,这是否会使封装的目的无效?
我有一个简单的程序:
class Element
{
public:
Element(void) { m_iVal = 56789;}
~Element(void) {};
private :
int m_iVal;
};
Run Code Online (Sandbox Code Playgroud)
变量m_iVal是私有的,这从概念的角度(继承,...)造成了限制。
然而,虽然是私有的,但仍然可以访问它的内容。
有没有办法禁止对变量(或堆区域)的物理访问,以便对该私有区域的任何访问都将导致内存访问冲突。
下面显示的是程序的粗略结构。
class Room
{
private:
Node* content;
public:
void someRoomMethod();
};
void Room::someRoomMethod() {}
class Node
{
private:
Node* nextNode;
std::variant<int, float> data;
public:
void someNodeMethod();
};
void Node::someNodeMethod() {}
Run Code Online (Sandbox Code Playgroud)
正如我在标题中提到的,Node除了 inside 之外没有在任何地方使用Room。我试图通过将 Node 设置为嵌套类来封装它,但它不起作用。
// Room.hh
class Room
{
private:
Room::Node* content; // ERROR: no type named "Node" in "Room" -- GCC
public:
void roomMethod();
class Node()
{
private:
Node* nextNode;
std::variant<int, float> data;
public:
void someNodeMethod();
}
};
// Room.cpp
void Room::someRoomMethod() {} // …Run Code Online (Sandbox Code Playgroud) encapsulation ×10
c++ ×5
c# ×3
oop ×3
inheritance ×2
private ×2
accessor ×1
asp.net ×1
c++11 ×1
class ×1
interface ×1
java ×1
objective-c ×1
properties ×1
public ×1
refactoring ×1