是否可以指定封闭类可以访问嵌套类的成员,而不是其他类?
这是问题的一个例子(当然我的实际代码有点复杂......):
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
课程实现的公共界面(尽管我的问题是最后一个要求......)
现在,如果您阅读MSDN for C#中的命名约定,您会注意到它声明属性始终优先于public和protected字段.有些人甚至告诉我,你永远不应该使用公共或受保护的领域.现在我同意我还没有找到一个理由,我需要有一个公共领域,但受保护的领域真的那么糟糕?
我可以看到它,如果您需要确保在获取/设置值时执行某些验证检查,但是在我看来,很多时候它似乎只是额外的开销.我的意思是说我有一个类GameItem,其中包含baseName,prefixName和suffixName的字段.我为什么要承担创建属性(C#
)或访问器方法的开销以及我将要发生的性能损失(如果我对应用程序中的每个字段执行此操作,我相信它会稍微增加一点,尤其是某些语言PHP
或某些具有性能的应用程序是否像游戏一样至关重要?
我目前正在编写CMS并记住有人(可能已经在这里)批评现有的CMS没有足够强大的用户权限系统.我有一个计划出来的方法,但我觉得它已陷入通常的陷阱,有点太细粒度,这使得理解和实施它对最终用户来说是一种恐怖.
我认为拥有一系列具有权限的默认用户角色就是答案,所以我想我的问题是:
您希望在CMS中看到哪些默认角色以及与这些角色相关联的权限类型?
提前致谢!
php permissions roles access-levels content-management-system
假设我们有以下示例代码:
protocol MyProtocol {
func someFunction()
}
public class MyClass {
}
public extension MyClass: MyProtocol {
func someFunction() {
print("hello")
}
}
Run Code Online (Sandbox Code Playgroud)
编译上面的代码会出现以下错误:
错误:'public'修饰符不能与声明协议一致性的扩展一起使用
如果我将扩展名标记为,则会出现同样的情况private
.它好像不能设置符合协议的扩展的访问级别,无论使用什么访问级别设置为中.甚至将协议声明设置为public
或private
不删除错误.
如果Swift符合协议,Swift以这种方式限制扩展访问级别的原因是什么?如果在类级别应用协议一致性,则不存在此类限制.
如果我服从编译器并删除private
/ public
指定,那么访问级别是someFunction()
多少?
extension MyClass: MyProtocol {
func someFunction() {
print("hello")
}
}
Run Code Online (Sandbox Code Playgroud)
我想在这种情况下,它将遵循原始的MyClass
实现,public
但我不确定.
这种行为是否存在,因为扩展中的协议一致性意味着整个类符合协议,因此在扩展中重新指定访问级别是多余的?
在Swift 4中,由于现在private
在同一源代码文件中也可以看到扩展,它与fileprivate
访问修饰符有什么不同?
背景:在Swift 3中,类中的私有变量在同一文件的扩展中不可见.为此,fileprivate
必须使用.
在以下代码中,使用Clang 8.0.0+进行编译,并-std=c++17
使用创建派生类实例,将B{}
给出error error: temporary of type 'A' has protected destructor
。A
当临时类型具有类型B
(因此应该具有公共析构函数)时,为什么在此消息中出现?
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) 如果我有一个类我想要的方法protected
和internal
.我希望只有程序集中的派生类才能调用它.
由于protected internal
手段protected
或者 internal
,你必须做出选择.在这种情况下你选择什么 - protected
或者internal
?
关于Java,C#,C++和PHP中的访问级别的一个常见误解是它适用于对象而不是类.也就是说,(比方说)X类的对象无法看到另一个X的私有成员.实际上,当然,访问级别是基于类的,一个X对象可以毫不费力地引用另一个的私有成员.
是否存在具有基于对象的访问级别的语言?它们是代替基于类的访问还是除了基于类的访问?这个功能对程序设计有什么影响?
在一个基类中,有一个受保护的过程.继承该类时,我希望隐藏该程序,使其不被外部使用.我尝试从私有甚至严格的私有部分覆盖它,但它仍然可以从外部调用.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) 显然,Java 有一个访问级别包私有,这是通过不添加任何显式修饰符来实现的。
但是有没有办法显式添加这个修饰符呢?当我们只想使用包中的成员时,我们需要省略访问级别,这有点令人困惑。
如果没有办法,为什么包私有决定作为默认级别?
例如,如果默认级别是公共的,那么我们会更有意识地定义相关的访问级别。
这与为什么使用它的问题不重复,因为我知道为什么,我只是不知道为什么它是隐式定义的并且不能显式定义。
编辑
您可以使用 Lombok 的@PackagePrivate显式定义它
用于指示带注释的实体具有包私有访问级别的明确意图。目前由 FieldDefaults 和 Value 使用,以避免将字段设为公共、受保护或私有字段之一。
@PackagePrivate String thanksLombok;
Run Code Online (Sandbox Code Playgroud) access-levels ×10
c# ×3
swift ×2
c++ ×1
c++17 ×1
coding-style ×1
delphi ×1
delphi-xe2 ×1
internal ×1
java ×1
nested-class ×1
object ×1
overriding ×1
performance ×1
permissions ×1
php ×1
protected ×1
protocols ×1
roles ×1
swift4 ×1