我试图了解C#中的嵌套类.我知道嵌套类是在另一个类中定义的类,我没有得到的是为什么我需要这样做.
如果我在C++中定义一个内部类,它是否自动成为包含它的类的朋友?例如,这是合法的:
class Outer {
public:
class Inner {
public:
void mutateOuter(Outer& o);
};
private:
int value;
};
void Outer::Inner::mutateOuter(Outer& o) {
o.value ++; // Legal? Or not?
}
Run Code Online (Sandbox Code Playgroud)
我问,因为在我试过的一些编译器(VS2003)上,这段代码不起作用,但我至少听说过它在某些编译器上有效.我无法在C++规范中找到关于此的相关部分,如果有人能够引用某些特定内容,那就是说它是合法的还是不合法的.
是否可以指定封闭类可以访问嵌套类的成员,而不是其他类?
这是问题的一个例子(当然我的实际代码有点复杂......):
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课程实现的公共界面(尽管我的问题是最后一个要求......)
我正在研究用于视频播放和录制的类集合.我有这就像公共接口,用类似的方法一个主类play(),stop(),pause(),record()等...然后,我有主力类里面做视频解码和视频编码.
我刚刚了解了C++中嵌套类的存在,我很想知道程序员对使用它们的想法.我有点小心,并不确定它的好处/缺点是什么,但它们似乎(根据我正在阅读的书)用于我的案例.
本书建议在像我这样的场景中,一个好的解决方案是将主要类嵌套在接口类中,因此客户端不打算使用的类没有单独的文件,并避免任何可能的命名冲突?我不知道这些理由.嵌套类对我来说是一个新概念.只是想看看程序员对这个问题的看法.
我的同事建议将几个Eclipse代码格式和警告设置更严格.这些变化中的大多数都是有意义的,但我在Java中得到了一个奇怪的警告.这里有一些重现"问题"的测试代码:
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass(); // !!!
this.anInstance.doSomething();
}
}
// using "this.anInstance" instead of "anInstance" prevents another warning,
// Unqualified access to the field WeirdInnerClassJavaWarning.anInstance
Run Code Online (Sandbox Code Playgroud)
与!!!线!使用我的新警告设置在Eclipse中向我发出此警告:
对包含构造函数WeirdInnerClassJavaWarning.InnerClass()的访问由合成访问器方法模拟.提高其可见性将改善您的表现.
这是什么意思?当我将"私有静态类"更改为"受保护的静态类"时,警告就消失了,这对我来说毫无意义.
编辑:我终于找到了"正确"修复.这里真正的问题似乎是这个嵌套的私有静态类缺少一个公共构造函数.那一个调整删除了警告:
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
public InnerClass() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass(); …Run Code Online (Sandbox Code Playgroud) 在一个XAML文件(WPF用户控件),有引用一个的方式内部类 "B"在另一个类中的"A"定义的?
public class A
{
public class B
{
}
}
Run Code Online (Sandbox Code Playgroud)
就像是 :
<local:A.B ... />
Run Code Online (Sandbox Code Playgroud)
此语法不起作用,因为"B"被解释为一个名为"B"类"A"的属性.
我尝试了更多异国情调的语法,如"::"或"+",但似乎都没有.
我目前正在使用带有VS2010的Silverlight 4.
在此先感谢您的帮助.
我有一个类MyClass和一个MyNestedClass像这样的内部类:
public class MyClass {
...
public class MyNestedClass {
...
}
}
Run Code Online (Sandbox Code Playgroud)
这两节课都很长.因此,我想将它们分成两个不同的文件,而不会破坏层次结构.这是因为使用MyClass的程序员不应该看到嵌套类.
有没有办法实现这一目标?
是否可以转发声明一个嵌套类,然后将其用作外部类的具体(不是指向/引用)数据成员的类型?
IE
class Outer;
class Outer::MaybeThisWay // Error: Outer is undefined
{
};
class Outer
{
MaybeThisWay x;
class MaybeThatOtherWay;
MaybeThatOtherWay y; // Error: MaybeThatOtherWay is undefined
};
Run Code Online (Sandbox Code Playgroud) 例如:
public class A : A.B
{
public class B { }
}
Run Code Online (Sandbox Code Playgroud)
这会从编译器生成此错误:
涉及'A'和'AB'的循环基类依赖
我总是认为一个嵌套类的行为就像一个普通的类,除了有关访问外部类的私有成员的特殊规则,但我想这两个类之间有一些隐式继承?
我有一个涉及嵌套枚举的数据结构,以便我可以执行以下操作:
Drink.COFFEE.getGroupName();
Drink.COFFEE.COLUMBIAN.getLabel();
Run Code Online (Sandbox Code Playgroud)
如果有方法声明:
someMethod(Drink type)
someOtherMethod(DrinkTypeInterface type)
Run Code Online (Sandbox Code Playgroud)
然后我可以说(适当地):
someMethod(Drink.COFFEE)
someOtherMethod(Drink.COFFEE.COLUMBIAN)
Run Code Online (Sandbox Code Playgroud)
这就是我想出的:
public enum Drink {
COFFEE("Coffee");
private String groupName;
private Drink(String groupName) {
this.groupName = groupName;
}
public enum Coffee implements DrinkTypeInterface {
COLUMBIAN("Columbian Blend"),
ETHIOPIAN("Ethiopian Blend");
private String label;
private Coffee(String label) {
this.label = label;
}
public String getLabel() {
return this.label;
}
}
String getGroupName() {
return this.groupName;
}
}
Run Code Online (Sandbox Code Playgroud)
和界面:
public interface DrinkTypeInterface {
public String getLabel();
}
Run Code Online (Sandbox Code Playgroud)
我想我只想试着用Java来解决这种事情的最佳方法,或者如果我需要编写一堆if语句来处理各个Drink.values().有帮助吗?