标签: access-levels

如何将对嵌套类成员的访问限制为封闭类?

是否可以指定封闭类可以访问嵌套类的成员,而不是其他类?

这是问题的一个例子(当然我的实际代码有点复杂......):

public class Journal
{
    public class JournalEntry
    {
        public JournalEntry(object value)
        {
            this.Timestamp = DateTime.Now;
            this.Value = value;
        }

        public DateTime Timestamp { get; private set; }
        public object Value { get; private set; }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

我想阻止客户端代码创建实例JournalEntry,但Journal必须能够创建它们.如果我将构造函数Journal设为public,那么任何人都可以创建实例......但如果我将其设为私有,则无法执行!

请注意,JournalEntry该类必须是公共的,因为我希望能够将现有条目公开给客户端代码.

任何建议将不胜感激!


更新:感谢大家的意见,我最终选择IJournalEntry了私人JournalEntry课程实现的公共界面(尽管我的问题是最后一个要求......)

c# nested-class access-levels

58
推荐指数
4
解决办法
2万
查看次数

受保护的成员/领域真的那么糟糕吗?

现在,如果您阅读MSDN for C#中的命名约定,您会注意到它声明属性始终优先于public和protected字段.有些人甚至告诉我,你永远不应该使用公共或受保护的领域.现在我同意我还没有找到一个理由,我需要有一个公共领域,但受保护的领域真的那么糟糕?

我可以看到它,如果您需要确保在获取/设置值时执行某些验证检查,但是在我看来,很多时候它似乎只是额外的开销.我的意思是说我有一个类GameItem,其中包含baseName,prefixName和suffixName的字段.我为什么要承担创建属性(C#)或访问器方法的开销以及我将要发生的性能损失(如果我对应用程序中的每个字段执行此操作,我相信它会稍微增加一点,尤其是某些语言PHP或某些具有性能的应用程序是否像游戏一样至关重要?

c# performance coding-style access-levels

31
推荐指数
4
解决办法
1万
查看次数

常见的CMS角色和访问级别

我目前正在编写CMS并记住有人(可能已经在这里)批评现有的CMS没有足够强大的用户权限系统.我有一个计划出来的方法,但我觉得它已陷入通常的陷阱,有点太细粒度,这使得理解和实施它对最终用户来说是一种恐怖.

我认为拥有一系列具有权限的默认用户角色就是答案,所以我想我的问题是:

您希望在CMS中看到哪些默认角色以及与这些角色相关联的权限类型?

提前致谢!

php permissions roles access-levels content-management-system

16
推荐指数
4
解决办法
1万
查看次数

为什么具有协议一致性的扩展不能具有特定的访问级别?

假设我们有以下示例代码:

protocol MyProtocol {
    func someFunction()
}

public class MyClass {

}

public extension MyClass: MyProtocol {
    func someFunction() {
        print("hello")
    }
}
Run Code Online (Sandbox Code Playgroud)

编译上面的代码会出现以下错误:

错误:'public'修饰符不能与声明协议一致性的扩展一起使用

如果我将扩展名标记为,则会出现同样的情况private.它好像不能设置符合协议的扩展的访问级别,无论使用什么访问级别设置为中.甚至将协议声明设置为publicprivate不删除错误.

如果Swift符合协议,Swift以这种方式限制扩展访问级别的原因是什么?如果在类级别应用协议一致性,则不存在此类限制.

如果我服从编译器并删除private/ public指定,那么访问级别是someFunction()多少?

extension MyClass: MyProtocol {
    func someFunction() {
        print("hello")
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在这种情况下,它将遵循原始的MyClass实现,public但我不确定.

这种行为是否存在,因为扩展中的协议一致性意味着整个类符合协议,因此在扩展中重新指定访问级别是多余的?

protocols access-levels swift swift-extensions

15
推荐指数
2
解决办法
4422
查看次数

Swift 4中private和fileprivate有什么区别

在Swift 4中,由于现在private在同一源代码文件中也可以看到扩展,它与fileprivate访问修饰符有什么不同?

背景:在Swift 3中,类中的私有变量在同一文件的扩展中不可见.为此,fileprivate必须使用.

access-modifiers access-control access-levels swift swift4

10
推荐指数
2
解决办法
5803
查看次数

“类型为'A'的临时类型具有受保护的析构函数”,但其类型为B

在以下代码中,使用Clang 8.0.0+进行编译,并-std=c++17使用创建派生类实例,将B{}给出error error: temporary of type 'A' has protected destructorA当临时类型具有类型B(因此应该具有公共析构函数)时,为什么在此消息中出现?

https://godbolt.org/z/uOzwYa

class A {
protected:
    A() = default;
    ~A() = default;
};

class B : public A {
// can also omit these 3 lines with the same result
public:
    B() = default;
    ~B() = default;
};

void foo(const B&) {}

int main() {

    // error: temporary of type 'A' has protected destructor
    foo(B{});
    //    ^

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ initialization access-levels language-lawyer c++17

10
推荐指数
1
解决办法
3652
查看次数

你选择什么,保护什么或内部?

如果我有一个类我想要的方法protectedinternal.我希望只有程序集中的派生类才能调用它.

由于protected internal手段protected 或者 internal,你必须做出选择.在这种情况下你选择什么 - protected或者internal

c# protected internal access-levels

8
推荐指数
2
解决办法
382
查看次数

是否有基于对象访问级别的语言?

关于Java,C#,C++和PHP中的访问级别的一个常见误解是它适用于对象而不是类.也就是说,(比方说)X类的对象无法看到另一个X的私有成员.实际上,当然,访问级别是基于类的,一个X对象可以毫不费力地引用另一个的私有成员.

是否存在具有基于对象的访问级别的语言?它们是代替基于类的访问还是除了基于类的访问?这个功能对程序设计有什么影响?

language-agnostic access-levels

7
推荐指数
1
解决办法
190
查看次数

如何隐藏对象的受保护过程?

在一个基类中,有一个受保护的过程.继承该类时,我希望隐藏该程序,使其不被外部使用.我尝试从私有甚至严格的私有部分覆盖它,但它仍然可以从外部调用.Original类不是我的,所以我无法改变TOriginal定义的方式.

是否可以在我继承的类中隐藏此过程?如何?

type
  TOriginal = class(TObject)
  protected
    procedure SomeProc;
  end;

  TNew = class(TOriginal)
  strict private
    procedure SomeProc; override;
  end;
Run Code Online (Sandbox Code Playgroud)

delphi overriding object access-levels delphi-xe2

7
推荐指数
1
解决办法
1696
查看次数

Java 定义显式的 package-private 修饰符

显然,Java 有一个访问级别包私有,这是通过不添加任何显式修饰符来实现的。

但是有没有办法显式添加这个修饰符呢?当我们只想使用包中的成员时,我们需要省略访问级别,这有点令人困惑。

如果没有办法,为什么包私有决定作为默认级别?

例如,如果默认级别是公共的,那么我们会更有意识地定义相关的访问级别。

这与为什么使用它的问题不重复,因为我知道为什么,我只是不知道为什么它是隐式定义的并且不能显式定义。

编辑

您可以使用 Lombok 的@PackagePrivate显式定义它

用于指示带注释的实体具有包私有访问级别的明确意图。目前由 FieldDefaults 和 Value 使用,以避免将字段设为公共、受保护或私有字段之一。

@PackagePrivate String thanksLombok;
Run Code Online (Sandbox Code Playgroud)

java access-modifiers access-levels

6
推荐指数
1
解决办法
3401
查看次数