标题:请教老师大侠:C#的 “类”、“对象”、“方法” 对应 “控件”、“属性”、 ...
只看楼主
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
不胜感激  hellovfp老师 的指导!!!

我 要好好读读您的 回复,谢拉!!!
2011-12-26 17:48
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
感谢 版主 给本帖 置高亮
2011-12-26 17:51
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
小飞侠 老师:

您深入浅出地用小猪形象讲解我全能明白,但是一到实际写代码就不知道如何下手。
比如建一个treeview的树文件夹目录,就不理解“类”、“对象”、“方法”。

下面就是“treeview的树文件夹目录”代码:

想系统地理解这里的“类”、“对象”、“方法”之间的关系:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            TreeNode treeNode = new TreeNode ("所有部门"); //创建根节点,TreeNode 类

            string[] department = new string[] { "人事部", "销售部", "研发部", "公关部", "测试部" };

            for (int i = 0; i < department.Length; i++) //循环把子节点添加到根节点下
            {
                TreeNode departement= new TreeNode(department[i]);//声明一个TreeNode变量

                treeNode.Nodes.Add(departement); //把部门添加到根节点下
            }

            treeView1.Nodes.Add(treeNode); //把根节点添加到treeview
        }

}
------------------------------------

我的问题:

1. namespace WindowsFormsApplication1  ---- 是命名空间,这里的完整代码语句最后可以生成一个完整的“windows应用程序”,对吗?

2.  public partial class Form1 : Form  ---- 声明一个“类”(form1类),它下面的花括号里面 又包含了1个类(TreeNode类)。

3. TreeNode类有2个属性(或称“实例化对象”?) ---- 一个是 treeNode,一个是departement ?

4.TreeNode类的属性(或称“实例化对象”?) 的如下代码:
 TreeNode treeNode = new TreeNode ("所有部门");
 TreeNode departement= new TreeNode(department[i]);
上面两行也可以成为 “变量”?
也就是说 类的 属性、对象、变量,这三个东东是一回事?

5.关于“方法”:
treeNode.Nodes.Add(departement); ----- treeNode 是 局部变量?   Nodes 是属性?   Add 是方法
treeView1.Nodes.Add(treeNode); ----- treeView1 是 类?   Nodes 是属性?    Add 是方法

先提出上面这些问题。
实在纠结难受啊!!

谢谢老师了!!!


2011-12-26 20:18
mamagoose
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-12-19
得分:0 
回复 13楼 learnerok
我也很菜,不过觉得你上面的例子还是比较好明白的。
TreeNode这种大写的表示的是类,也就是大侠例子里的猪这一类型的动物
treeNode这种小写的表示的是一个具体化了的类,也就是一个类的实例。也就是一个诸如小白,小花之类的猪。
不管是实例,还是类中,都有变量和函数声明,分别构成其属性和方法,譬如你的树节点里面的name和addnote,也就分别是大侠例子猪的重量/名字变量和猪的吃/睡函数。
你这个例子中partial我还没看过,估计是半继承之类的东西,从Form类中继承一些,然后又有自己的一些性质。错了别拍我。

概念很多,加上中文英文翻译搞不清楚,刚开始学的时候,抓大放小,把主要的搞清楚了,别的再慢慢来。
namespace 在我看来就是一个库函数调用,把这个东西加上,你就可以用很多现成的函数,否则,你用了人家的函数,不标注人家的出处,编译的时候就会出错。



[ 本帖最后由 mamagoose 于 2011-12-26 21:22 编辑 ]
2011-12-26 21:19
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
感谢 mamagoose !

最好按我的1,2,3,4,5.来 一条一条 说就更好了。
否则我还是跟不上啊,我太笨了
2011-12-26 22:52
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
回复 10楼 mamagoose
一般情况下,属性首字母大写,这个是编程的风格要求,但属性名可以不与成员变量取类似的名字,你甚至可以写一个Weiget属性名来对应类的成员变量height,实现属性隐藏封装。因为height是私有private变量,不允许类的对象(实例)直接访问,别人并不知道Weiget属性对应的居然是height,所以回道楼主的问题来说,看到表面的东西,并不是真实的类的内部。

这个代码你可以创建一个C# Console控制台工程进行运行,手敲代码。建议在学习的时候,不要一下进入GUI窗口界面编程,有时候在控制台下,有利于我们把学习的重点放在基础知识上面,不受界面额外知识的影响。充分理解面象对象的精髓,然后再进行界面编程,会一马平川的。

我们都在路上。。。。。
2011-12-27 11:33
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用hellovfp在2011-12-27 11:33:24的发言:

一般情况下,属性首字母大写,这个是编程的风格要求,但属性名可以不与成员变量取类似的名字,你甚至可以写一个Weiget属性名来对应类的成员变量height,实现属性隐藏封装。因为height是私有private变量,不允许类的对象(实例)直接访问,别人并不知道Weiget属性对应的居然是height,所以回道楼主的问题来说,看到表面的东西,并不是真实的类的内部。
 
这个代码你可以创建一个C# Console控制台工程进行运行,手敲代码。建议在学习的时候,不要一下进入GUI窗口界面编程,有时候在控制台下,有利于我们把学习的重点放在基础知识上面,不受界面额外知识的影响。充分理解面象对象的精髓,然后再进行界面编程,会一马平川的。
感谢  hellovfp 老师 的细致入微的指导,在下感激不尽啊!

想系统了解C#的 类、对象、方法、事件 等待重要概念。起码先能读懂别人的程序,知道这条语句是类,那条语句是对属性的等等....。

您能就我上面的例子 给指导一下吗?

多谢 多谢 多谢!!!!
2011-12-27 12:48
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:12 
回复 13楼 learnerok
这个正常,国内多数人学习C#之前,并没有讲过数据结构和windows win32编程。
所以理解GUI界面上面的东西估计会有一些难度。

1. namespace WindowsFormsApplication1  ---- 是命名空间,这个代码是IDE,就是你的VS帮你写上去的,创建工程的时候就会写好,所以不利于我们学习namespace关键字的用途。namespace这个关健字来自C++语言,主要用于划分大的模块,通常情况下,一个namespace命名空间会包含很多的类,类的实例,辅助方法(非类的成员),这么一个大的功能块用namespace进行包裹,主要防止全局命名污染,举个C语言的实例来说,你能在全局声名两个一样的函数名或变量名么?
#include <stdio.h>

void print(int x);
void print(int x); //能同时么?

int g_height;
int g_height; //能同时么?

int main()
{
    return 0;
}
答案是不能。所以C++才会出现namespace关键字,这个关键字对于库开发者特别有用,而且可以跨文件,使得人们在开发库的时候,可以把不同的类代码放在不同的文件中,而他们处于同一个名字空间,就象在一个文件中声明一样。
所以namespace 后面跟的名字实际上是可以自己命名的。例如我们开发一个同时支持三个棋类游戏的程序,可以把三种棋类的类放进一个名字空间namespace ChessGame{ }中,使用时用using ChessGame.xxxx;来表示要使用名字空间里的类。

2.  public partial class Form1 : Form  ---- 声明一个“类”(form1类),它下面的花括号里面 又包含了1个类(TreeNode类)。
这个也是IDE帮你写的代码,所以你不清楚,一个windows程序倒底是如何生成的。当然,IDE帮你写的代码还不少,所以你会很迷乎这些类是如何来的。注意到下面这句
        public Form1()
        {
            InitializeComponent();
        }
了么?它也是IDE帮你写的,我们所有的程序运行都在幕后呢。右点InitializeComponent,选转到定义,你就可以看到IDE帮你写了多少代码,N多的类在里面实例化。partial关键字用于把类定义拆分为几个部分,便于代码管理,所以刚才你看到的N多的类实例化,就是分在了不同的文件中,InitializeComponent()方法里。public partial class Form1 : Form这句化是指你自己定义一个类,类名叫Form1,这个类名是可以改的,但同时你要修改整个项目的其它地方,Form1继承自Form,继承的意义不知道你学过没有?Form来自哪里?你可能会问,这是微软写的.NET类库中的一个类,就是窗体类,而程序的最上面的using System.Window.Form语句指示了这个类来自名字空间System.Window.Form里。同样你使用TreeNode类,这个类来自哪里,是你写的么?肯定不是,是微软写的一个类。不象我们的小猪类,全部是自己写的。因此昨天的学习实际上就是让你知道类是怎么抽象,怎么用代码实现的。

3. TreeNode类有2个属性(或称“实例化对象”?) ---- 一个是 treeNode,一个是departement ?
你应该明确的知道,TreeNode本身就是类,这个类的属性有哪些,你可以通过一个对象实例或是查找MSDN中找到,肯定不止二个。TreeNode treeNode = new TreeNode ("所有部门"); treeNode是TreeNode类的实例化对象。一般看到new关键字了,不用说,等号左边的肯定是对象。同理TreeNode departement= new TreeNode(department[i]);departement也是TreeNode类的实例化对象。treeNode.Nodes,注意,这里的Nodes才是TreeNode类的属性,而且是一个集合。add()是Nodes的方法,所以你可以调用,意思是把TreeNode的对象添加到Nodes集合中,当然,Nodes还不止add这个方法。集合是一个容器,通俗的讲,就象是一个蓝子,蓝子里面可以放鸡蛋对象。

4.TreeNode类的属性(或称“实例化对象”?) 的如下代码:
TreeNode treeNode = new TreeNode ("所有部门");
TreeNode departement= new TreeNode(department[i]);
上面两行也可以成为 “变量”?
也就是说 类的 属性、对象、变量,这三个东东是一回事?

这就是我们必须分清楚的东西,类,实际上称为类类型,和我们的值类型int实际上是一回事,我们用int i来声名一个变量i,和我们用类来声名一个类对象实际上表述是一回事,TreeNode treeNode;和i变量一样,只是左边的类型是TreeNode类类型,而i变量的类型是int,因此广义上的类也包括值类型,换句话说int也是类,它的方法就是+,-,*,/,%。等等,i + 10 = i.add(10)。所以对象和变量实际上是一回事,属性也是变量,只不过它属于类,类对象可以成为类的成员变量么?可以,看下面的代码:
class Leg //脚类
{
    private int _legs; //脚数量。
    public Leg(int x)
    {
        _legs = x;
    }
}

class LittlePig //小猪类
{
    private double height;  //重量
    private string name; //名字
    private Leg leg;  //脚
    public LittlePig(string name, double height)//构造方法
    {
        this.name = name;
        this.height = height;
        leg = new Leg(4);  //一个小猪有四条脚。
    }

    public double Height //height的属性
    {
        get { return height; }
        set { this.height = value; }
    }
    public void eat()    //吃方法
    {
        Console.WriteLine("{0} is eatting. ", name);
    }
    public void sleep()  //睡方法
    {
        Console.WriteLine("{0} is sleepping.", name);
     }
}

5.关于“方法”:
treeNode.Nodes.Add(departement); ----- treeNode 是 局部变量?   Nodes 是属性?   Add 是方法
treeView1.Nodes.Add(treeNode); ----- treeView1 是 类?   Nodes 是属性?    Add 是方法

首先我们要明白一个层次关系,树是由节点组成的,通常有一个根.
Root----node---node
 |------node
 |------node
         |----node
treeView1 是类TreeView(控件)的对象实例,Nodes是一个TreeView类的(集合)属性,集合属于Collection类,都有添加,删除,插入方法,所以Add是方法。所以Nodes内部对应的变量又是Collection类的对象实例。这就是类与类之间复杂的关系,但这些复杂的关系最后概括出来,就两种,继承和组合。第四点已经给你示例了组合这个关系。
treeNode是类TreeNode的对象实例,也可以称变量,如果在局部声明就是局部变量,同理,Nodes和Add来自哪里,不用偶多说了吧?

[ 本帖最后由 hellovfp 于 2011-12-27 13:03 编辑 ]

我们都在路上。。。。。
2011-12-27 12:57
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
如果你觉得上面的解释可能超出了你的理解范围,可以看这里
http://apps.hi.baidu.com/share/detail/34441402
vs类图标所代表的含义,图解,然后仔细通过图标含义对应讲述的这些内容。
.Net的类库是如此的庞大,你可以查找相关的.net类库类分布图,继承图来理解这些类的关系。

我们都在路上。。。。。
2011-12-27 13:33
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用hellovfp在2011-12-27 13:33:03的发言:

如果你觉得上面的解释可能超出了你的理解范围,可以看这里
http://apps.hi.baidu.com/share/detail/34441402
vs类图标所代表的含义,图解,然后仔细通过图标含义对应讲述的这些内容。
.Net的类库是如此的庞大,你可以查找相关的.net类库类分布图,继承图来理解这些类的关系。

谢谢 恩师!!! 我一定好好拜读您的讲解!!!

2011-12-27 13:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-358578-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050145 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved