12楼,你会不会写C#程序,还不明白? new A.B(); 这时会考虑owner? 就象 net A();你会考虑this,base??真是不知所云14楼,水平 实在有限,看来泡csdn 的确没前途 什么聚合不聚合的,完全 不知道你在说什么...嵌套类 使用的场合是好象不多,作用不大,但不代表 完全 和其它类没有区别,没有适用场合.定义嵌套类不是用来new A.B();的 一般来说是物主类自己使用的 不让外部看到,物主类可以用内部类来管理自己的代码和功能,总之 有了内部类之后 会让 物主类代码写得更愉快,功能管理更舒适,怎么使用 都可以,随便举个例子来说,比如你自定义一个集合类class MyList{ public void Add(object o){} public void Remove(object o){} ... Node root,next; class Node{ public Node next; public object data; } ... }定义内部类把不必要呈现的内部实现都隐藏了..
你还没明白我在说什么 class A { public class B { public B() { var b = base.ToString(); var t = this.ToString(); var o = owner.ToString(); } } } 就这样如果new A.B()的时候,base和this的使用都没问题,可owner是什么。你不能让嵌套类都定义成private的把
18楼,我的确没明白你意思 owner是一个内部类可见的默认物主类实例(唯一且存在) new A.B()的时候从B实例内部看是可以访问A实例的即owner
lz意思是 class A { public class B { ... } } 如果 A.B r1=new A.B(); 就同时new了A 和new了B? 这样B就可以用A的属性方法什么的?
class A{ class B{} }对于java来说, B的实例是依附于A的实例存在的 A a = new A(); A.B = new a.B();//貌似是这么写 所以自然就有存在"owner"但对于c#来说,class B等同于java中的static class B B与A只存在一个命名空间包含的关系
class A { public string Name; public A(string name) { Name = name; } public class B { public string GetOwnerName() { return owner.Name; } } }A a1 = new A("1"); A a2 = new A("2"); A.B b = new A.B(); b.GetOwnerName() = 什么?
to 39 public class A{ string s; public A(string s){this.s=s;} void M(){this.s="xxx";}//this的使用不以其何种构造函数而设计时不能用 }所以owner也一样,编译报错也好隐匿加入无参默认构造也好,都一样,反正设计时可用编译时报不报错 看设计。
class 汽车{车门 a1,a2;发动机 b1;} class 车门{} class 发动机{} ... 这是通常的聚合好处是 各部分可独立 继承 ... 通过内部类 class 汽车{车门 a1,a2;发动机 b1; class 车门{} class 发动机{} } ... 让外部不可见汽车的内部结构定义(类型定义) 而继承只能针对 汽车,这样做也是可以的 灵活其实并没损失,反而封装性更好,让 代码更逻辑性更好,更容易管理,
对于车子来说,他只需要4个轮子,符合条件的各个品牌的轮子都行,而具体使用了那种轮子,是在对象实例化时定义的,这也是LZ的问题所在,青龙白虎已经说到实处了。在扩展一下: 使用owner在很多实例化情况下会造成歧义,如: 1. 实例化类种类时,外部类未实例化,里面的意义就很混乱,因此使用owner就不能允许“public” 类种类 2. 外部类的所有对象都会被自动实例化,这样就要求类中类只能有一个特定的无参构造函数,实际上LZ的需求,使用C#的类中类很容易处理: class A { private string _T; private B _Tb; public A() { _Tb=new B(this); } class B { private A _Owner; public B(A a) { _Owner=a; } public void DoSometing() { _Owner._T="hello";
class A{class B{}}这两行是有差别的,定义在类内部的类 是它的一个成员“天生”知道这个类的其它成员包括私有成员
而非嵌套类就不能够知道 你明白吗? 加owner和加 this, base一样 自然 你懂不懂??!!
class A{class B{}}嵌套类只在特殊的设计时会用到
当你 A.B b=new A.B() 时,A类并没有实例,所以也不存在owner
owner就象base 只在子类里面使用访问父类一样 只在嵌套类里使用以访问物主类class A{
string m;
class B{
void M(){
owner.m="hello world";
}
}
}嵌套类的物主总是确定的,并且唯一,没有必要写成这样class A{
string m;
class B{
void M(){
A a=new A();
a.m="hello world";
}
}
}
orclass A{
string m;
class B{
A a=new A();
void M(){
a.m="hello world";
}
}
}
new A.B(); 这时会考虑owner? 就象 net A();你会考虑this,base??真是不知所云14楼,水平 实在有限,看来泡csdn 的确没前途
什么聚合不聚合的,完全 不知道你在说什么...嵌套类 使用的场合是好象不多,作用不大,但不代表 完全 和其它类没有区别,没有适用场合.定义嵌套类不是用来new A.B();的 一般来说是物主类自己使用的
不让外部看到,物主类可以用内部类来管理自己的代码和功能,总之 有了内部类之后 会让
物主类代码写得更愉快,功能管理更舒适,怎么使用 都可以,随便举个例子来说,比如你自定义一个集合类class MyList{
public void Add(object o){}
public void Remove(object o){}
...
Node root,next;
class Node{
public Node next;
public object data;
}
...
}定义内部类把不必要呈现的内部实现都隐藏了..
class A
{
public class B
{
public B()
{
var b = base.ToString();
var t = this.ToString();
var o = owner.ToString();
}
}
}
就这样如果new A.B()的时候,base和this的使用都没问题,可owner是什么。你不能让嵌套类都定义成private的把
new A.B()的时候从B实例内部看是可以访问A实例的即owner
class A { public class B { ... } }
如果 A.B r1=new A.B();
就同时new了A 和new了B? 这样B就可以用A的属性方法什么的?
唯一能保证这个的就是把A设计成static的,可如果是static的了,那就没必要用owner关键字了,直接访问就行了
内部类是帮助物主类的一个中间工具,比如分类功能,隐藏实现,有时很有用,见前面我举的MyList示意
class B{}
}对于java来说, B的实例是依附于A的实例存在的 A a = new A(); A.B = new a.B();//貌似是这么写
所以自然就有存在"owner"但对于c#来说,class B等同于java中的static class B
B与A只存在一个命名空间包含的关系
{
public string Name;
public A(string name)
{
Name = name;
} public class B
{
public string GetOwnerName()
{
return owner.Name;
}
}
}A a1 = new A("1");
A a2 = new A("2");
A.B b = new A.B();
b.GetOwnerName() = 什么?
试了一下原来java是这样new的
A a = new A();
A.B b = a.new B();即使是java也没有owner关键字
class A{
string member;
B CreateB(){return new B(this);}
class B{
A owner;
protected B(A a){this.owner = a;}
void M(){
owner.member="***";
}
}
}
没有用过类中类.
从实用性来说:
是乎 只有静态类才有这个必要。(但c# 用程序集代取了!)
当然,我写js 也有这么干,那是因为怕跟同事们的变量冲突!类名冲突!从楼主的描述看,
楼主这种写法,似乎给C# 加上 一些复杂的东西。
{
string _T;
private A(string t)
{
_T=t;
}
//....
Class ListA:List<A>
{
public ListA( list<string> x)
{
// ...
//可批量创建A对象,并形成一个集合,但不允许单个创建A对象
}
}
}
class A{
string s;
class B{
//支持自定义物主类的情况吗?如果自定义物主类怎么处理?
A a1,a2,a3;
//or
A[] aas;
public B(){
a1=new A();a2=new A();a3=new A();
aas=new A[3];//
}
void M(){
owner.s="nb";
this.a1.s=owner.s;
this.a2.s=owner.s;
this.a3.s="sb";
this.aas[0].s="xx"; ...
}
}
}这也没什么,owner可以做成为一个系统提供的默认设计时可访问的实例关键字 就象this,或base
但上面的M 内也可以设计为让a1,a2,a3,aas[x]不可见s成员只能由owner才可见 a1,a2,a3,aas[x]这些和外部实例相同 权限,这些可以考虑owner 和 this,base 实在太象了 这样就,都代表一个 设计时默认实例他的好处是 this.后面可见本类成员,base.后面可见父类成员(外部不可见protected而base.可见,但不可见
private成员)owner.后可见物主类的所有成员当我们定义一个类的时候 this即存在 因为唯一且确定,base也存在因为默认继承object,
base的作用是当父类成员和本类成员有岐义时可以区分,base也是唯一确定的,如果多继承base关键字就不能确定。
owner也是唯一确定的,
b.GetOwnerName() = 什么?
public class A{
string s;
public A(string s){this.s=s;}
void M(){this.s="xxx";}//this的使用不以其何种构造函数而设计时不能用
}所以owner也一样,编译报错也好隐匿加入无参默认构造也好,都一样,反正设计时可用编译时报不报错
看设计。
但是为什么你不换个角度,从C#这边看来这种嵌套类根本就不存在其“父子”性,如果想确定“父子”性完全可以通过设计来实现而不是考语法本身来提供这种若有若无的对象关系。如果你这样想,那么你考虑过JAVA应该增加些类似委托的概念呢?语言各有所长,没必要都把一个语言框定在某个其他语言的规定下。
从现实角度来出发,也有很多这种情况。比如:
一个车子类型:
一个轮子类型:(从轮子内部也有轮胎类型)
一个车灯类型:
这种类型中 的类型,用C# 的继承方法来表示, 始终都感到不妥!
一个车让它继承于轮子? 轮子继承于轮胎又继承于轮框?[不合理吧,C# 没有多继承啊]
好你说用接口来现实?
想到就不知多复杂!
这不算C# 的一个缺点,那算什么?
或许C# 的设计目的就不是搞这个, 又 或许C# 的设计没有考虚到这个呢,谁又肯定?
总之不得不说:
这是一个缺点。
class 车门{}
class 发动机{}
...
这是通常的聚合好处是 各部分可独立 继承
...
通过内部类
class 汽车{车门 a1,a2;发动机 b1;
class 车门{}
class 发动机{}
}
...
让外部不可见汽车的内部结构定义(类型定义)
而继承只能针对 汽车,这样做也是可以的
灵活其实并没损失,反而封装性更好,让
代码更逻辑性更好,更容易管理,
你的意思还是要默认生成一个A的隐藏实例,这个A的隐藏实例只能由B.owner来访问,甚至连A自己都没法访问这个实例,有什么意思,B自己new一个A出来不完全一样么
如果是这样那问题真的大了,LS说感觉很可笑,所谓的内嵌类真的没什么用
去看看UML吧
class 车子
{
private 轮子[] _轮子集合;
public 轮子[] 轮子集合
{
get;
set;
}
}
class 轮子
{
....
}
{
private 前大灯[] _前大灯集合;
public 前大灯[] 前大灯集合
{
get;
set;
}
class 轮子
{
owner.前大灯=.... // 这样会是什么情况? 轮胎上安了个前大灯?实际是汽车的前大灯,滥用下去不一锅绛紫才怪。
}
}
一、如果要自动实例化外部类,那么必须外部类有一个无参数的构造函数,但是C#设计成了当你提供了一个有参数的构造函数时,无参数的构造函数将自动屏蔽,只有不提供任何构造函数的情况下,才会自动创建无参数的构造函数。
二、如果每个内部类的实例都有一个默认的外部类实例,那资源的浪费将不可想象,内部类如果用在List列表或者数组里,将可能创建很多个这样的实例,而每个实例都有一个owner实例,这意味着实例体积无形中变大了,很不合理。别告诉我不同的内部类实例共享一个外部类实例,那就没必要用owner关键字了,直接将外部类声明为静态的就足够。
三、C#发展到现在了,编程习惯和兼容性问题必须考虑,你的大胆设想破坏了这些,而且不止C#,整个.NET语言是互通的,任何基于.NET的语言,都是最终编译为IL语言,所以任何改动必须要考虑兼容性。
对于车子来说,他只需要4个轮子,符合条件的各个品牌的轮子都行,而具体使用了那种轮子,是在对象实例化时定义的,这也是LZ的问题所在,青龙白虎已经说到实处了。在扩展一下:
使用owner在很多实例化情况下会造成歧义,如:
1. 实例化类种类时,外部类未实例化,里面的意义就很混乱,因此使用owner就不能允许“public” 类种类
2. 外部类的所有对象都会被自动实例化,这样就要求类中类只能有一个特定的无参构造函数,实际上LZ的需求,使用C#的类中类很容易处理:
class A
{
private string _T;
private B _Tb; public A()
{
_Tb=new B(this);
}
class B
{
private A _Owner; public B(A a)
{
_Owner=a;
}
public void DoSometing()
{
_Owner._T="hello";
}
} }
这样的构造,保留了更广泛的适应性,也不乏灵活性。