举一个整数冒泡排序的例子:
/// <summary>
/// 整数排序
/// </summary>
class SortInt
{
/// <summary>
/// 比较大小
/// </summary>
/// <param name="i1"></param>
/// <param name="i2"></param>
/// <returns></returns>
public bool compare(int i1, int i2)
{
if (i1 > i2)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 排序
/// </summary>
/// <param name="tosort"></param>
public void sort(int[] tosort)
{
for (int i = 0; i < tosort.Length; i++)
{
for (int j = 0; j < tosort.Length - (i + 1); j++)
{
if (compare(tosort[j], tosort[j + 1]))
{
int temp = tosort[j];
tosort[j] = tosort[j + 1];
tosort[j + 1] = temp;
}
}
}
}
}
class Program
{
static void Main(string[] args)
{
int[] tosortint = new int[] { 8, 7, 6, 5 };
SortInt si = new SortInt();
si.sort(tosortint);
for (int i = 0; i < tosortint.Length; i++)
{
Console.WriteLine(tosortint[i]);
}
}
}
然后再举一个职员薪水冒泡排序的例子
/// <summary>
/// 职员
/// </summary>
class Employee
{
private int id;
private string name;
private double salary;
public Employee(int id, string name, double salary)
{
this.id = id;
this.name = name;
this.salary = salary;
}
public int ID
{
get { return id; }
set { id = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public double Salary
{
get { return salary; }
set { salary = value; }
}
}
/// <summary>
/// 职员薪水排序
/// </summary>
class SortEmployee
{
public bool compare(Employee e1, Employee e2)
{
if (e1.Salary > e2.Salary)
{
return true;
}
else
{
return false;
}
}
public void sortEmployee(Employee[] tosort)
{
for (int i = 0; i < tosort.Length; i++)
{
for (int j = 0; j < tosort.Length - (i + 1); j++)
{
if (compare(tosort[j], tosort[j + 1]))
{
Employee e = tosort[j];
tosort[j] = tosort[j + 1];
tosort[j + 1] = e;
}
}
}
}
}
class Program
{
static void Main(string[] args)
{
Employee[] tosortemployee = new Employee[] { new Employee(2, "zh", 600), new Employee(1, "pm", 200) };
SortEmployee se = new SortEmployee();
se.sortEmployee(tosortemployee);
for (int i = 0; i < tosortemployee.Length; i++)
{
Console.WriteLine(tosortemployee[i].Salary);
}
}
}
这两个例子
相同之处:排序算法相同
不同之处:比较对象不同/比较算法不同
为了实现代码重用,体现oop思想,我们进行如下重构:
class Program
{
static void Main(string[] args)
{
object[] tosortint = new object[] { 8, 7, 6, 5 };
SortInt si = new SortInt();
SortDel sd = new SortDel(si.compare);
Sort s = new Sort();
s.sort(tosortint, sd);
for (int i = 0; i < tosortint.Length; i++)
{
Console.WriteLine(tosortint[i]);
}
Console.WriteLine("*******************************************************");
object[] tosortemployee = new object[] { new Employee(2, "zh", 600), new Employee(1, "pm", 200) };
SortEmployee se = new SortEmployee();
sd = new SortDel(se.compare);
s = new Sort();
s.sort(tosortemployee, sd);
for (int i = 0; i < tosortemployee.Length; i++)
{
Console.WriteLine(((Employee)tosortemployee[i]).Salary);
}
}
}
/// <summary>
/// 整数比较
/// </summary>
class SortInt
{
public bool compare(object o1, object o2)
{
int i1 = Convert.ToInt32(o1);
int i2 = Convert.ToInt32(o2);
if (i1 > i2)
{
return true;
}
else
{
return false;
}
}
}
/// <summary>
/// 职员
/// </summary>
class Employee
{
private int id;
private string name;
private double salary;
public Employee(int id, string name, double salary)
{
this.id = id;
this.name = name;
this.salary = salary;
}
public int ID
{
get { return id; }
set { id = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public double Salary
{
get { return salary; }
set { salary = value; }
}
}
/// <summary>
/// 职员薪水比较
/// </summary>
class SortEmployee
{
public bool compare(object o1, object o2)
{
Employee e1 = (Employee)o1;
Employee e2 = (Employee)o2;
if (e1.Salary > e2.Salary)
{
return true;
}
else
{
return false;
}
}
}
/// <summary>
/// 比较代理
/// </summary>
/// <param name="o1"></param>
/// <param name="o2"></param>
/// <returns></returns>
public delegate bool SortDel(object o1, object o2);
/// <summary>
/// 通用排序
/// </summary>
class Sort
{
public void sort(object[] tosort, SortDel sd)
{
for (int i = 0; i < tosort.Length; i++)
{
for (int j = 0; j < tosort.Length - (i + 1); j++)
{
if (sd(tosort[j], tosort[j + 1]))
{
object e = tosort[j];
tosort[j] = tosort[j + 1];
tosort[j + 1] = e;
}
}
}
}
}
重构?
在此引入了SortDel代理,用来进行比较两个对象,在进行整数类冒泡排序时此代理指向整数类的比较方法,而在进行自定义职员类的冒泡排序时指向自定义职员类的比较方法,从而使冒泡排序算法被抽象出来,成为一个通用的方法.今后再需要进行学生单科成绩/学生综合成绩的冒泡排序时,只需添加一个学生类,再提供一个单科成绩比较的方法和一个综合成绩比较的方法,就可以了,不需再把冒泡排序的算法再写一遍,实现了代码的重用,体现了OOP.
分享到:
相关推荐
事件通常与委托结合使用,委托作为事件处理程序的类型。事件的声明通常在类的私有部分进行,以防止外部代码直接访问: ```csharp public event MyDelegate MyEvent; ``` 发布者可以引发事件,而订阅者可以通过添加...
这是一个委托使用场景的简化示例,实际上,在.NET框架中,委托的使用更加灵活和强大。 事件是一种特殊的委托,用于实现发布/订阅模式,它允许一个对象在状态发生变化时通知其他对象。在.NET框架中,事件的使用通常...
代码如下://普通委托 DeleteShow ds = new DeleteShow(ShowName); Console.WriteLine(“———————-“); Console.WriteLine(“普通委托—-请输入用户名:”); string Name = Console.ReadLine(); Console....
通过这个实例,我们可以看到,C#委托不仅用于事件处理,还可以用于回调函数、异步编程等多种场景。它使得代码更加模块化,提高了程序的可维护性和可扩展性。理解并熟练运用委托是成为C#程序员的关键一步。在实际开发...
今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景。Func,Action,Predicate全面解析首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型: ...
简而言之,委托就是对函数的引用,它使得代码能够更加灵活地处理回调、事件驱动等场景。通过委托,可以实现诸如异步操作、事件响应等功能。 #### 二、定义委托类型 首先,我们需要定义一个委托类型。根据提供的...
C#中,我们通常使用`Action`,`Func`等预定义委托类型,或者自定义委托类型。 委托的常见用途包括事件处理。在事件驱动编程中,事件源会发布事件,其他对象可以订阅这些事件并提供事件处理方法。事件处理方法通过...
本文将深入探讨委托的概念,以及如何在多线程和事件处理等场景下有效地使用委托。 首先,让我们从基本概念开始。在C#中,委托是一种引用类型,它可以指向一个或多个具有相同签名的方法。这意味着你可以创建一个委托...
它们各自有着独特的功能,但在某些场景下,选择使用委托而非接口可能会带来更高效、更灵活的代码设计。本篇文章将深入探讨何时应考虑使用委托,以及它与接口之间的区别。 首先,我们需要了解委托的基本概念。委托在...
在Unity3D中,我们通常使用`Application.LoadLevelAsync()`方法来异步加载新的场景,这允许游戏在加载新场景的同时继续执行其他操作,从而提高用户体验。然而,确保场景加载完成并在正确的时间进行后续操作是非常...
委托的使用在各种场景下都非常常见,如事件处理、回调函数以及异步编程等。 1. **委托的定义** 委托的定义通常包括返回类型和参数列表,这与我们要委托的方法相匹配。例如,一个简单的委托定义可能如下: ```...
下面将详细解释委托的基本概念、用途以及如何在实际编程场景中使用它们。 ### 委托的基本概念 在.NET框架中,委托是一种引用类型的数据类型,用于封装方法的引用。它类似于其他语言中的函数指针,但提供了类型安全...
匿名委托是C#中一种特殊的委托形式,它允许我们在不创建显式委托类型的情况下定义和使用委托。匿名委托的语法如下: ```csharp delegate return_type delegate_name(parameters); ``` 在实际代码中,我们通常会...
在C#编程语言中,委托是一种强大的特性,它允许...无论是单播还是多播委托,它们都在许多关键的设计模式和编程场景中发挥着重要作用,如回调、异步编程、事件处理等。熟练掌握委托的使用对于提升C#编程能力至关重要。
在上面的生活场景中,"订票委托单"就是一种委托,它定义了订票所需的信息,并允许公司、行政和出差员工之间进行通信,而无需他们直接交互。 2. **定义委托** 在C#中,我们使用`delegate`关键字来定义一个新的委托...
然后,我们可以在类中定义一个使用这个委托的方法,例如: ```csharp public class Calculator { public int Add(int a, int b) { return a + b; } } ``` 现在,我们可以创建一个`MyDelegate`类型的实例,将`...
在C#中,我们使用`delegate`关键字来创建自定义的委托类型。例如: ```csharp public delegate int SimpleDelegate(int a, int b); ``` 上面的代码定义了一个名为`SimpleDelegate`的新委托类型,它接受两个整数...
通过具体的代码示例,我们还展示了委托在实际项目中的应用场景,即在文件复制过程中实现进度追踪。通过理解和掌握这些知识点,可以帮助开发者更好地利用.NET框架提供的功能,提高程序的灵活性和扩展性。
在C#编程语言中,委托是一种强大的特性,它允许我们将...在实际项目中,委托常用于异步编程、事件驱动编程以及任何需要将行为作为数据传递的场景。通过学习和实践,开发者可以更好地掌握这一核心概念,提升编程技巧。
在实际开发中,委托、匿名方法和 Lambda 表达式广泛用于事件处理、回调、数据处理管道和其他需要传递行为的场景。VS2008 支持这些特性,让开发者能够充分利用 C# 的这些强大功能来构建灵活和可扩展的代码。 综上所...