我想如果一个类只在另一个类中实例化,那么在该类中嵌套使用它是正确的.我认为这将有助于我们良好的设计.当我看到我的项目时,我几乎从未见过这样的嵌套结构.但是,如果我尝试嵌套类,那么这次我脑子里会出现另一个问题.例如
我有Board类,Move类,如ShortCastle,LongCastle,EnPassant,Promote和Pieces,如Pawn,Queen,Rook,Knight等.很明显,Board类将实例化Piece类,Piece类将实例化Move类.对于一个好的设计,Promote移动类应该嵌套Pawn,因为只有pawn可以提升自己.short和long Castles应该嵌套King,因为只有king可以有这样的类型移动.
试图将所有Piece类放入Board类并不是很好的设计,因为8-9类将在Board类中,并且它真的很烦人,一个Board类文件太大而且难以读取.我更喜欢将每个类保持在另一个类中文件.很好,我们可以创建部分董事会类但仍然不烦恼8-9部分董事会类文件将持有每个类的类?最好不要让它们嵌套吗?相同的部分为另一个Move类创建另一个部分Piece文件?如果嵌套类只占用很小的空间,那么它不会有任何问题,但是如果需要很多方法呢?
如何为一个像这样的嵌套私有类重载一个operator <<?
class outer {
private:
class nested {
friend ostream& operator<<(ostream& os, const nested& a);
};
// ...
};
Run Code Online (Sandbox Code Playgroud)
在外部类编译器之外尝试抱怨隐私时:
error: ‘class outer::nested’ is private
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
class A {
class B {};
};
template <typename C>
class D : A::B {};
void f() {
D<int> d;
}
Run Code Online (Sandbox Code Playgroud)
D<int>继承自A::B哪个私有嵌套类.我原以为这是一个错误,但GCC接受这个代码.它是海湾合作委员会的一个错误还是我错过了什么?
我在嵌套类中的方法参数注释中遇到了一个奇怪的效果.看起来非常像编译器问题.有关重现的详细信息和步骤,请参见下文.
使用javac编译以下类(我使用了javac 1.7.0_51).请注意带注释的参数"boolean param3".
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class TestAnnotations {
public String a;
@Retention(RetentionPolicy.CLASS)
@interface MyAnnotation {}
protected class TestInner {
public TestInner(String param1, Object param2,
@MyAnnotation boolean param3) {}
public void accessField() {
System.out.println(TestAnnotations.this.a);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后用javap检查嵌套类(即javap -p -v -c TestAnnotations $ TestInner.class).它的构造函数如下所示.
public test.TestAnnotations$TestInner(test.TestAnnotations, java.lang.String,
java.lang.Object, boolean);
flags: ACC_PUBLIC
Code:
stack=2, locals=5, args_size=5
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:Ltest/TestAnnotations;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return …Run Code Online (Sandbox Code Playgroud) 我想知道封闭类可以创建多少个静态成员类的实例.我只假设一个,但是Bloch的以下摘录对我来说没有意义.
引用Joshua Bloch的有效Java - 项目22*:支持非静态的静态成员类.
私有静态成员类的常见用法是表示由其封闭类表示的对象的组件.例如,考虑一个Map键,它将键与值相关联.许多Map实现都为地图中的每个键值对都有一个内部Entry对象.虽然每个条目都与一个映射关联,但条目上的方法(getKey,getValue和setValue)不需要访问映射.因此,使用非静态成员类来表示条目是浪费的:私有静态成员类是最好的.如果您不小心在条目声明中省略了静态修饰符,则地图仍然有效,但每个条目都将包含对地图的多余引用,这会浪费空间和时间.
他声明地图为地图中的每个键值对创建了一个Entry对象,即静态成员类的多个实例.
所以我的假设是错误的!这意味着我对静态成员类的理解是错误的.每个人都知道静态成员变量的行为方式,例如经典的静态最终字符串 - 只有一个对象的实例.
这是否意味着当实例化封闭对象时,实际上没有实例化静态成员类?
那么在这种情况下,使用静态成员类进行Entry的Map有什么意义呢?为什么不在API上使用接口?然后,每个其他Collections类都可以提供它自己的实现.
[*]刚才意识到它是我所拥有的PDF版本的第18项
在这里,我试图使用内部静态助手类为我的数据库连接实现单例类:
package com.myapp.modellayer;
public class DatabaseConnection {
private DatabaseConnection() {
//JDBC code...
}
private static class ConnectionHelper {
// Instantiating the outer class
private static final DatabaseConnection INSTANCE = new DatabaseConnection();
}
public static DatabaseConnection getInstance() {
return ConnectionHelper.INSTANCE;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我怀疑这个静态内部类ConnectionHelper何时被加载到JVM内存中:
在加载DatabaseConnection类时,还是在调用getInstance()方法时?
具体来说,任何人都可以给我具体的例子,说明何时或何时不使用嵌套类?
我永远都知道这个功能,但从来没有理由使用它.
谢谢.
我们可以在C#中使用嵌套类.这些嵌套类也可以继承OuterClass.例如:
public class OuterClass
{
// code here
public class NestedClass : OuterClass
{
// code here
}
}
Run Code Online (Sandbox Code Playgroud)
完全可以接受.
我们也可以在不将NestedClass作为OuterClass的嵌套类的情况下实现这一点,如下所示:
public class OuterClass
{
// code here
}
public class NestedClass : OuterClass
{
// code here
}
Run Code Online (Sandbox Code Playgroud)
我想知道,上面两个场景之间有什么区别?在方案I中可以实现什么,在方案II中无法实现?通过使NestedClass"嵌套"到OuterClasss,我们能得到更多的东西吗?
我将从rubykoans教程中显示您的代码片段.考虑下一个代码:
class MyAnimals
LEGS = 2
class Bird < Animal
def legs_in_bird
LEGS
end
end
end
def test_who_wins_with_both_nested_and_inherited_constants
assert_equal 2, MyAnimals::Bird.new.legs_in_bird
end
# QUESTION: Which has precedence: The constant in the lexical scope,
# or the constant from the inheritance hierarchy?
# ------------------------------------------------------------------
class MyAnimals::Oyster < Animal
def legs_in_oyster
LEGS
end
end
def test_who_wins_with_explicit_scoping_on_class_definition
assert_equal 4, MyAnimals::Oyster.new.legs_in_oyster
end
# QUESTION: Now which has precedence: The constant in the lexical
# scope, or the constant from the inheritance hierarchy? …Run Code Online (Sandbox Code Playgroud) 使用css时,如何指定嵌套类.
这是我的html代码:
<div class="box1">
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">Collapsable</h3>
<div class="box-tools pull-right">
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div><!-- /.box-tools -->
</div><!-- /.box-header -->
<div class="box-body">
<p><i class="fa fa-phone"></i><span style=""> Phone : 0800 000 000</span></p>
<p><i class="fa fa-home"></i><span style=""> Web : http://www.example.com</span></p>
<p><i class="fa fa-map-marker"></i><span style=""> Map : example map address</span></p>
<p><i class="fa fa-envelope"></i><span style=""> Email : example@address.com</span></p>
</div><!-- /.box-body -->
</div><!-- /.box -->
</div>
Run Code Online (Sandbox Code Playgroud)
此css代码适用html于页面上的所有内容:
<style type="text/css">
i{width: 30px;}
</style> …Run Code Online (Sandbox Code Playgroud) nested-class ×10
c# ×3
java ×3
c++ ×2
class ×2
nested ×2
.net ×1
annotations ×1
class-design ×1
css ×1
g++ ×1
gcc ×1
html ×1
inheritance ×1
javac ×1
oop ×1
ruby ×1
scopes ×1
singleton ×1
static-class ×1