标签: encapsulation

如何/应该隐藏C++静态成员变量和函数?

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)

c++ encapsulation c++11

0
推荐指数
1
解决办法
310
查看次数

封装在目标c中

我对封装有点困惑.一般(或在Obj-C中),它是指分离接口/实现还是暗示通过方法访问ivars?

请澄清.谢谢.

encapsulation objective-c

0
推荐指数
1
解决办法
2678
查看次数

如何从C#中的接口隐藏已实现属性的set方法?

大家问候......

如果我有以下界面:

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)

然后,我只可能setproperty实现上述的抽象类的类内...

c# inheritance encapsulation interface

0
推荐指数
1
解决办法
272
查看次数

即使宣布公开,财产也会失去价值

我有一个文件SiteMinder.CSApp_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)

c# asp.net encapsulation properties

0
推荐指数
1
解决办法
120
查看次数

get 和 set 方法有什么意义

在我的 CS 课程中,我只是在学习课程和 OOP。

因此,当您创建一个类时,您会初始化一定数量的私有变量。

我知道您将它们设为私有,因为如果它们是公开的,它们将很容易更改并可能导致很多错误。

所以我们使用 get 和 set 方法来改变变量。但这再次使变量很容易改变,对吗?那么首先将它们设为私有有什么意义呢?

java oop encapsulation class

0
推荐指数
1
解决办法
3036
查看次数

在C++中是否可以通过类似属性的语法调用访问器?

我正在使用大型代码库,并且有许多公开定义的变量.不幸的是,访问这些变量的功能已经改变,这个新功能最好由公共​​访问器和私有实例变量封装.

所以,我正在努力做出这一改变.为此,我计划将每个公共属性设为私有,然后创建访问器.但是,我不想更改任何访问旧公共属性的代码.例如:

将公共属性更改为私有后,我有以下类:

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)

任何帮助是极大的赞赏!

c++ refactoring encapsulation accessor

0
推荐指数
1
解决办法
142
查看次数

对象切片会破坏封装吗?

我看到它的方式,在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 …

c++ oop inheritance encapsulation

0
推荐指数
1
解决办法
99
查看次数

为什么我会使用自动实现而不是封装?

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)

我被告知要始终封装所有变量而不是将它们声明为公共变量,而自动实现似乎就是这样做的.

当字段被声明为公共时,这是否会使封装的目的无效?

c# encapsulation private public

0
推荐指数
1
解决办法
46
查看次数

逻辑私有 VS 物理私有

我有一个简单的程序:

class Element
{
public:
    Element(void) { m_iVal = 56789;}
    ~Element(void) {};
private :
    int m_iVal;
};  
Run Code Online (Sandbox Code Playgroud)

变量m_iVal是私有的,这从概念的角度(继承,...)造成了限制。
然而,虽然是私有的,但仍然可以访问它的内容。

在此处输入图片说明

有没有办法禁止对变量(或堆区域)的物理访问,以便对该私有区域的任何访问都将导致内存访问冲突。

c++ encapsulation private

0
推荐指数
1
解决办法
66
查看次数

如何封装一个只在另一个类中使用的类?

下面显示的是程序的粗略结构。

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)

c++ oop encapsulation inner-classes

0
推荐指数
1
解决办法
70
查看次数