学习面向对象编程语言实际上是学习好面向对象编程的各种原则、方法、技巧、经验、模式等;
注意:下面通过一个项目实战【模拟考试系统】,从这个过程中展示各种方法原则;
一、项目需求分析
1)试题数据存放在文本文件中,分析格式(后面可以改成数据);
2)面向对象程序设计的分析基本步骤:
1.分析项目中有哪些类(或者对象)参与程序。分析结果:
- 对象选择的标准:【名词分析法】
- 第一, 这个对象的确能参与程序的运行;
- 第二, 这个对象有对象的基本特征(属性、方法);
- 第三, 对象必须是项目强相关的对象;
初步找到的:试卷、试题、计算机、考生、答案、题干、选项…
筛选后:
试卷类:本项目中只包含一张试卷(后续拓展可以做成多套试卷);
试题类:包括题干、选项、答案 (经过分析答案还应该有一个独立的对象);
答案类:正确答案、答案分析、所选答案;(答案和试题是关联的)
边界类:项目主界面(负责和用户交互,完成对象关联)
2.分析项目中类或对象之间的关系。分析结果:
- 试卷<–>试题:一张试卷包含若干试题;一对多;试题在试卷中应该以集合对象形式存在;
- 试题<–>答案:一对一;答案这个对象应该在试题中以对象属性形式存在;
- 边界类<–>试卷:一个窗体中有一个试卷对象;
二、面向对象中,类的设计方法
1)设计答案类:
- 属性:
- 正确答案、所选答案、答案分析;
2)设计试题类:
- 属性:
- 试题编号、题干、选项A、B、C、D、答案对象(类似于数据库外键)
3)设计试卷类:
- 属性:
- 试题集合List<>、
- 方法:
- 抽取试题;
- 题目选择;
- 提交试卷;
4)设计边界类:
- 属性:
- 试卷对象、试题序号;
- 方法:【或者可以理解为事件】
- 抽取试题;
- 题目选择;
- 提交试卷;
(三)总结
- 通过程序编写重点体会对象之间的关系确定方法。
- 掌握OOP方法,在程序开发过程中,可以做到业务和前端分离,符合“高内聚、低耦合”;更好地让不同的开发者开发自己的业务部分;
代码实现:
1、Paper 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace TeachDemo.Models
{
/// <summary>
/// 试卷类
/// </summary>
public class Paper
{
public Paper()
{
questions = new List<Question>(); //只要是对象类型,最好都在这里进行初始化一下
}
/// <summary>
/// 试题集合对象
/// </summary>
private List<Question> questions; //私有字段
public List<Question> Questions //属性,设置为只读属性
{
get { return this.questions; }
}
/// <summary>
/// 抽取全部试题
/// </summary>
public void ExtractQuestions()
{
FileStream fs = new FileStream("questions.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string contents = sr.ReadToEnd(); //一次性读取全部内容
string[] questionArry = contents.Split(Convert.ToChar("&")); //将字符串分割为试题对象数组
string[] question = null; // 保存一道试题
foreach (string item in questionArry)
{
//将一道试题字符串分隔后变成数组信息
question = item.Trim().Split(Convert.ToChar("\r"));
this.questions.Add(new Question
{
Title = question[0].Trim(),
OptionA = question[1].Trim(),
OptionB = question[2].Trim(),
OptionC = question[3].Trim(),
OptionD = question[4].Trim(),
QAnswer = new Answer() { RightAnswer = question[5].Trim() } //凡是对象使用之前都要new一下
});
}
sr.Close();
fs.Close();
SavePaper();
}
private void SavePaper()
{
FileStream fs = new FileStream("questions.obj", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, this.questions); //将当前文本文件中读取的数据对象,保存为集合对象,并以序列化的方式存在
fs.Close();
}
//下面的方法可以替代上面的方法,当然第一次是不行的,但是开发以后给用户是可以的
//public void ExtractQuestions()
//{
// FileStream fs = new FileStream("questions.obj", FileMode.Open);
// BinaryFormatter bf = new BinaryFormatter();
// this.questions = (List<Question>)bf.Deserialize(fs); //反序列化以后是object类型,需要进行强制类型转换
// fs.Close();
//}
/// <summary>
/// 提交试卷
/// </summary>
/// <returns></returns>
public int SubmitPaper()
{
int score = 0;
foreach (Question item in this.questions)
{
if (item.QAnswer.SelectedAnswer == string.Empty) continue;
if (item.QAnswer.RightAnswer.Equals(item.QAnswer.SelectedAnswer))
score += 5;
}
return score;
}
}
}
2、Question类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TeachDemo.Models
{
/// <summary>
/// 试题类
/// </summary>
[Serializable]
public class Question
{
/// <summary>
/// 构造方法(在方法中使用初始化)
/// </summary>
public Question()
{
QAnswer = new Answer(); //初始化
}
public int QuestionId { get; set; }
public string Title { get; set; }
public string OptionA { get; set; }
public string OptionB { get; set; }
public string OptionC { get; set; }
public string OptionD { get; set; }
public Answer QAnswer { get; set; } //答案(对象属性)
}
}
3、Answer类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TeachDemo.Models
{
/// <summary>
/// 答案类
/// </summary>
[Serializable] //标记可序列化
public class Answer
{
public string RightAnswer { get; set; } = string.Empty;
public string SelectedAnswer { get; set; } = string.Empty;
public string AnswerAnalysis { get; set; } = string.Empty;
}
}
(四)通过链式编程与对象的使用完成项目功能
日月忽其不淹兮 发布了39 篇原创文章 · 获赞 1 · 访问量 1191 私信 关注所谓链式编程其实是面向对象编程,所有的操作都基于对象,对象之间可能还有包含于被包含的关系,这样不断地通过“ . ”连接,就形成了一条链: