none
到底怎么才能面向对象开发? RRS feed

  • 问题

  • 学习ASP.NET也一段时间了。看了不少视频教程,也了解一些面向对象的思路,可是怎么才能在实际工作中使用面向对象模式来开发呢?比如我写一个新闻发布系统,那些功能应该归到一个类里,什么时候,怎么样来使用封装、多态、继承,这让我无从下手。也下过“PetShop4.0”,可是真看不懂,对我这种菜鸟来说这个系统有点错综复杂,不知道从哪看起。请问各位大侠有没有讲些初级点“实例”的视频教程、文字教程、源码或者个人经验也可以。先谢谢了。
    2010年8月6日 11:40

答案

  • 你好:

    确实需要有大量的实际开发经验才能深入理解。所以建议现在你从一般的类开始。网上有猫抓老鼠的案例。就是一种比较简单的面向对象处理对象的案例。

    http://www.cnblogs.com/ladeng6666/archive/2009/01/10/1373238.html
    http://space.cnblogs.com/group/topic/5588/

    面向对象是一组思维方法、分析方法和编程方法的集合。

    http://www.cnblogs.com/barton131420/archive/2007/11/04/948968.html

    希望对你有所帮助.

    2010年8月9日 6:27
    版主
  • 你好 hkstb,

    小弟設計了兩個類,但只是給您參考用的,不一定符合您所需,

    您參考看看吧~~~

     

    1. Category.cs

    using System;
    using System.Collections.Generic;
    
    /// <summary>
    /// 分類類
    /// </summary>
    public class Category
    {
      /// <summary>
      /// 預設建構子
      /// </summary>
    	public Category()
    	{
    	}
    
      /// <summary>
      /// 新增一個分類
      /// </summary>
      /// <param name="id">分類編號</param>
      /// <param name="ParentID">父類編號</param>
      /// <param name="name">名稱</param>
      /// <returns>是否新增成功</returns>
      public static bool AddCategory(Guid id, Guid ParentID, string name)
      {
        //做某些操作
        //回傳是否新增成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 刪除一個分類
      /// </summary>
      /// <param name="id">分類編號</param>
      /// <returns>是否刪除成功</returns>
      public static bool DeleteCategory(Guid id)
      {
        //做某些操作
        //回傳是否刪除成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 查詢一個分類
      /// </summary>
      /// <param name="id">分類編號</param>
      /// <returns>新聞對象</returns>
      public static Category GetCategory(Guid id)
      {
        Category cate = null;
        //做某些操作取得單一個分類記錄並新建出Category對象,指派各項屬性予他,加入到 newses 串列裡
        //若取不到新聞記錄,就別新建對象了,直接 return 現在正好是 null 的 news 對象即可~
        return cate;
      }
    
      /// <summary>
      /// 更新一個分類
      /// </summary>
      /// <param name="id">分類編號</param>
      /// <param name="parentID">父類編號</param>
      /// <param name="name">分類名稱</param>
      /// <returns>是否更新成功</returns>
      public static bool UpdateCataegory(Guid id, Guid parentID, string name)
      {
        //依照分類編號的引數找到對應的分類,並將其他欄位的值更新為其他引數的值
        //回傳是否更新成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 查詢某個父類的所有分類
      /// </summary>
      /// <param name="parentID">父類編號</param>
      /// <returns>分類對象串列</returns>
      public static List<Category> GetParentCategories(Guid categoryID)
      {
        List<Category> categories = new List<Category>();
        //做某些操作取得分類記錄並新建出Category對象,指派各項屬性予他,加入到 categories 串列裡
        return categories;
      }
    
      /// <summary>
      /// 分類編號
      /// </summary>
      public Guid ID
      {
        set;
        get;
      }
    
      /// <summary>
      /// 父類編號
      /// </summary>
      public Guid ParentID
      {
        set;
        get;
      }
    
      /// <summary>
      /// 分類名稱
      /// </summary>
      public string Name
      {
        set;
        get;
      }
    }
    

    2. News.cs

    using System;
    using System.Collections.Generic;
    
    /// <summary>
    /// 新聞類
    /// </summary>
    public class News
    {
      /// <summary>
      /// 預設建構子
      /// </summary>
    	public News()
    	{
    	}
    
      /// <summary>
      /// 新增一篇新聞
      /// </summary>
      /// <param name="categoryID">分類編號</param>
      /// <param name="title">標題</param>
      /// <param name="content">內文</param>
      /// <returns>是否新增成功</returns>
      public static bool AddNews(Guid categoryID, string title, string content)
      {
        //做某些操作
        //回傳是否新增成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 刪除一篇新聞
      /// </summary>
      /// <param name="id">新聞編號</param>
      /// <returns>是否刪除成功</returns>
      public static bool DeleteNews(Guid id)
      {
        //做某些操作
        //回傳是否刪除成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 查詢一篇新聞
      /// </summary>
      /// <param name="id">新聞編號</param>
      /// <returns>新聞對象</returns>
      public static News GetNews(Guid id)
      {
        News news = null;
        //做某些操作取得單一筆新聞記錄並新建出News對象,指派各項屬性予他,
        //若取不到新聞記錄,就別新建對象了,直接 return 現在正好是 null 的 news 對象即可~
        return news;
      }
    
      /// <summary>
      /// 更新一篇新聞
      /// </summary>
      /// <param name="id">新聞編號</param>
      /// <param name="categoryID">分類編號</param>
      /// <param name="title">標題</param>
      /// <param name="content">內文</param>
      /// <returns>是否更新成功</returns>
      public static bool UpdateNews(Guid id, Guid categoryID, string title, string content)
      {
        //依照新聞編號的引數找到對應的新聞,並將其他欄位的值更新為其他引數的值
        //回傳是否更新成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 查詢所有新聞
      /// </summary>
      /// <returns>新聞對象串列</returns>
      public static List<News> GetAllNews()
      {
        List<News> newses = new List<News>();
        //做某些操作取得新聞記錄並新建出News對象,指派各項屬性予他,加入到 newses 串列裡
        return newses;
      }
    
      /// <summary>
      /// 查詢某個分類的所有新聞
      /// </summary>
      /// <param name="categoryID">分類編號</param>
      /// <returns>新聞對象串列</returns>
      public static List<News> GetCategoryNews(Guid categoryID)
      {
        List<News> newses = new List<News>();
        //做某些操作取得新聞記錄並新建出News對象,指派各項屬性予他,加入到 newses 串列裡
        return newses;
      }
    
      /// <summary>
      /// 新聞編號
      /// </summary>
      public Guid ID
      {
        set;
        get;
      }
    
      /// <summary>
      /// 分類編號
      /// </summary>
      public Guid CategoryID
      {
        set;
        get;
      }
    
      /// <summary>
      /// 標題
      /// </summary>
      public string Title
      {
        set;
        get;
      }
    
      /// <summary>
      /// 內文
      /// </summary>
      public string Content
      {
        set;
        get;
      }
    }
    



    • 已标记为答案 hkstb 2010年8月12日 10:24
    • 已编辑 DK. Da 2012年6月10日 2:31
    2010年8月12日 8:33
  • 你好hkstb,

    關於你的疑問「比如新闻系统,有分类、有新闻、有评论、有管理员 等等,如果使用面向对象,它们之间应该如何设计?」

    其實跟貓抓老鼠是相同的意思。

    現在你有各種角色、各種事物,現在要把他們資訊化,

    每個東西都是一個對象(類的實例),你的分類是個類、新聞是個類、評論是個類、管理員是個類,

    每個類的實例能具有什麼功能都得要看你想讓他們具有什麼功能,

    比如分類就是拿來群組新聞用,新聞本身帶有標題、標籤、分類的編號,評論是針對哪一篇新聞、甚至加上頂或是不頂的功能,管理員的權限分級、誰可以管理哪個分類,

    這些你都想過了之後,自然你就知道你要怎麼去設計,也不需要人家提供代碼,因為絕對不可能百分之百符合你的需求......



    2010年8月10日 7:01

全部回复

  • 还是实践出真知。做的项目多了,大了,自然就会往这方面考虑了。

    建议常去一些技术博客,社区浏览一下前辈们写的文章,对自己大有帮助。

    2010年8月7日 5:27
  • 实践出真知,我同意,不过这比较适合有团队带着。像我这种单兵作战实践就有点吃力,就像我上面说的有点无从下手。要是有像“如何通过面向对象思路将一个公告板扩展到新闻系统”这样的实例教程,那我们入门应该可以了。
    2010年8月7日 9:12
  • 你好:

    确实需要有大量的实际开发经验才能深入理解。所以建议现在你从一般的类开始。网上有猫抓老鼠的案例。就是一种比较简单的面向对象处理对象的案例。

    http://www.cnblogs.com/ladeng6666/archive/2009/01/10/1373238.html
    http://space.cnblogs.com/group/topic/5588/

    面向对象是一组思维方法、分析方法和编程方法的集合。

    http://www.cnblogs.com/barton131420/archive/2007/11/04/948968.html

    希望对你有所帮助.

    2010年8月9日 6:27
    版主
  • 谢谢 BoberSong版主 的帮助,不过这个猫抓老鼠的案例其实是讲解什么是类,什么是对象和一些类的特性。其实我想要的是真实开发项目时如何使用面向对象。比如新闻系统,有分类、有新闻、有评论、有管理员 等等,如果使用面向对象,它们之间应该如何设计?

    我看教程是不太好找了。各位有没有源码给共享一下啦!谢谢先。

    2010年8月10日 5:33
  • 你好hkstb,

    關於你的疑問「比如新闻系统,有分类、有新闻、有评论、有管理员 等等,如果使用面向对象,它们之间应该如何设计?」

    其實跟貓抓老鼠是相同的意思。

    現在你有各種角色、各種事物,現在要把他們資訊化,

    每個東西都是一個對象(類的實例),你的分類是個類、新聞是個類、評論是個類、管理員是個類,

    每個類的實例能具有什麼功能都得要看你想讓他們具有什麼功能,

    比如分類就是拿來群組新聞用,新聞本身帶有標題、標籤、分類的編號,評論是針對哪一篇新聞、甚至加上頂或是不頂的功能,管理員的權限分級、誰可以管理哪個分類,

    這些你都想過了之後,自然你就知道你要怎麼去設計,也不需要人家提供代碼,因為絕對不可能百分之百符合你的需求......



    2010年8月10日 7:01
  • “每個東西都是一個對象(類的實例),你的分類是個類、新聞是個類、評論是個類、管理員是個類”这个我可以理解。可是他们之间会有一些依赖关系,这些关系应该如何写?比如“分類就是拿來群組新聞”分类如何群组新闻?这两个类如何编写呢?
    2010年8月11日 7:10
  • 你好hkstb,

    1. 在分類的數據表裡面加一個行當作他的編號,看你要用nvarchar, int, uniqueidentifier 都可以,
        然後在分類的類裡面加上對應的屬性。

    2. 在新聞的數據表裡面加一個行,存對應的分類的編號,當然資料型別要跟分類的數據表那個編號的行一樣,
        然後在新聞的類裡面加一個屬性來存分類的編號,日後你要取某個分類裡面的新聞,只要根據這個編號就可以了,
        這是關聯式數據庫的應用。

    應用實例:
    做一個下拉選單,裡面塞入每個分類的資料,包含分類名稱(text)以及分類編號(value),
    再做一個GridView,裡面根據分類下拉選單選項的value來對數據庫做查詢,
    這樣就會有「群組」的效果......

    根據小弟之前的做法,會在分類上面再加一個大分類,也就是類似這樣:
    「政治新聞」->「國內新聞」->「各則新聞」
                            ->「國外新聞」->「各則新聞」

    「體育新聞」->「籃球」->「各則新聞」
                            ->「棒球」->「各則新聞」
                            ->「網球」->「各則新聞」

    不知道這樣解說您能否有所體會~~~?



    • 已编辑 DK. Da 2012年6月10日 2:32
    2010年8月11日 7:22
  • 非常感谢“張振中”的热心回复,而且回复速度更令我咋舌。谢谢!

    可能是我表达不是很清晰,让这位老兄误解了,我想问的是这两个类如何编写呢?比如像下面两个类,如何处理他们之间的关系。

    //新闻类

    public class 新闻 {

    属性 标题;

    属性 所属分类;

    属性 内容;//等等吧。

    方法 添加文章(){....}

    方法 删除文章(文章ID){....}//等等吧。

    //分类类

    public class 分类 {

    属性 分类名称;

    属性 父类名称;

    属性 排序;//等等吧。

    方法 添加分类(){....}

    方法 删除分类(分类ID){....}//等等吧。

    2010年8月11日 7:50
  • 你好 hkstb,

    小弟設計了兩個類,但只是給您參考用的,不一定符合您所需,

    您參考看看吧~~~

     

    1. Category.cs

    using System;
    using System.Collections.Generic;
    
    /// <summary>
    /// 分類類
    /// </summary>
    public class Category
    {
      /// <summary>
      /// 預設建構子
      /// </summary>
    	public Category()
    	{
    	}
    
      /// <summary>
      /// 新增一個分類
      /// </summary>
      /// <param name="id">分類編號</param>
      /// <param name="ParentID">父類編號</param>
      /// <param name="name">名稱</param>
      /// <returns>是否新增成功</returns>
      public static bool AddCategory(Guid id, Guid ParentID, string name)
      {
        //做某些操作
        //回傳是否新增成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 刪除一個分類
      /// </summary>
      /// <param name="id">分類編號</param>
      /// <returns>是否刪除成功</returns>
      public static bool DeleteCategory(Guid id)
      {
        //做某些操作
        //回傳是否刪除成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 查詢一個分類
      /// </summary>
      /// <param name="id">分類編號</param>
      /// <returns>新聞對象</returns>
      public static Category GetCategory(Guid id)
      {
        Category cate = null;
        //做某些操作取得單一個分類記錄並新建出Category對象,指派各項屬性予他,加入到 newses 串列裡
        //若取不到新聞記錄,就別新建對象了,直接 return 現在正好是 null 的 news 對象即可~
        return cate;
      }
    
      /// <summary>
      /// 更新一個分類
      /// </summary>
      /// <param name="id">分類編號</param>
      /// <param name="parentID">父類編號</param>
      /// <param name="name">分類名稱</param>
      /// <returns>是否更新成功</returns>
      public static bool UpdateCataegory(Guid id, Guid parentID, string name)
      {
        //依照分類編號的引數找到對應的分類,並將其他欄位的值更新為其他引數的值
        //回傳是否更新成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 查詢某個父類的所有分類
      /// </summary>
      /// <param name="parentID">父類編號</param>
      /// <returns>分類對象串列</returns>
      public static List<Category> GetParentCategories(Guid categoryID)
      {
        List<Category> categories = new List<Category>();
        //做某些操作取得分類記錄並新建出Category對象,指派各項屬性予他,加入到 categories 串列裡
        return categories;
      }
    
      /// <summary>
      /// 分類編號
      /// </summary>
      public Guid ID
      {
        set;
        get;
      }
    
      /// <summary>
      /// 父類編號
      /// </summary>
      public Guid ParentID
      {
        set;
        get;
      }
    
      /// <summary>
      /// 分類名稱
      /// </summary>
      public string Name
      {
        set;
        get;
      }
    }
    

    2. News.cs

    using System;
    using System.Collections.Generic;
    
    /// <summary>
    /// 新聞類
    /// </summary>
    public class News
    {
      /// <summary>
      /// 預設建構子
      /// </summary>
    	public News()
    	{
    	}
    
      /// <summary>
      /// 新增一篇新聞
      /// </summary>
      /// <param name="categoryID">分類編號</param>
      /// <param name="title">標題</param>
      /// <param name="content">內文</param>
      /// <returns>是否新增成功</returns>
      public static bool AddNews(Guid categoryID, string title, string content)
      {
        //做某些操作
        //回傳是否新增成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 刪除一篇新聞
      /// </summary>
      /// <param name="id">新聞編號</param>
      /// <returns>是否刪除成功</returns>
      public static bool DeleteNews(Guid id)
      {
        //做某些操作
        //回傳是否刪除成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 查詢一篇新聞
      /// </summary>
      /// <param name="id">新聞編號</param>
      /// <returns>新聞對象</returns>
      public static News GetNews(Guid id)
      {
        News news = null;
        //做某些操作取得單一筆新聞記錄並新建出News對象,指派各項屬性予他,
        //若取不到新聞記錄,就別新建對象了,直接 return 現在正好是 null 的 news 對象即可~
        return news;
      }
    
      /// <summary>
      /// 更新一篇新聞
      /// </summary>
      /// <param name="id">新聞編號</param>
      /// <param name="categoryID">分類編號</param>
      /// <param name="title">標題</param>
      /// <param name="content">內文</param>
      /// <returns>是否更新成功</returns>
      public static bool UpdateNews(Guid id, Guid categoryID, string title, string content)
      {
        //依照新聞編號的引數找到對應的新聞,並將其他欄位的值更新為其他引數的值
        //回傳是否更新成功,這兒你得自己判斷~
        return true;
      }
    
      /// <summary>
      /// 查詢所有新聞
      /// </summary>
      /// <returns>新聞對象串列</returns>
      public static List<News> GetAllNews()
      {
        List<News> newses = new List<News>();
        //做某些操作取得新聞記錄並新建出News對象,指派各項屬性予他,加入到 newses 串列裡
        return newses;
      }
    
      /// <summary>
      /// 查詢某個分類的所有新聞
      /// </summary>
      /// <param name="categoryID">分類編號</param>
      /// <returns>新聞對象串列</returns>
      public static List<News> GetCategoryNews(Guid categoryID)
      {
        List<News> newses = new List<News>();
        //做某些操作取得新聞記錄並新建出News對象,指派各項屬性予他,加入到 newses 串列裡
        return newses;
      }
    
      /// <summary>
      /// 新聞編號
      /// </summary>
      public Guid ID
      {
        set;
        get;
      }
    
      /// <summary>
      /// 分類編號
      /// </summary>
      public Guid CategoryID
      {
        set;
        get;
      }
    
      /// <summary>
      /// 標題
      /// </summary>
      public string Title
      {
        set;
        get;
      }
    
      /// <summary>
      /// 內文
      /// </summary>
      public string Content
      {
        set;
        get;
      }
    }
    



    • 已标记为答案 hkstb 2010年8月12日 10:24
    • 已编辑 DK. Da 2012年6月10日 2:31
    2010年8月12日 8:33
  • 谢谢“張振中”兄弟,你很热心。在和你的讨论中就有所收获。
    2010年8月12日 10:25
  • 你好 hkstb,

    小弟做的沒什麼,只不過把以往走過的路、寫過的代碼拿出來分享而已,

    MSDN 不就是分享用的麼~~~ 呵呵

    小弟知道有位程序員,他著重的就是熱誠,

    有熱誠才能在資訊這個領域活下去啊~~~

     

    共勉之~~~



    • 已编辑 DK. Da 2012年6月10日 2:32
    2010年8月12日 10:41