抽象类

抽象类那点事(一步步案例分析,为什么需要它)

说一句题外话,本人学C# 不到一个月时间,今天同事说了2个 区别 抽象类与区别,我感觉请教前辈 超过自己的看10个小时的理解。

抽象类
abstract
抽象方法的类要声明为抽象类
构造函数和静态方法不能声明为抽象

多态性是一个虚方法,可以重写这个方法,实现同一个方法不同的表现形式

对于抽象方法的重写,是说的对于这个方法的派生类的实现。
对于抽象类和接口的方法都需要实现。

抽象方法是无法写方法体的
抽象类可以写 实现的方法
接口不可以写 实现的方法
案例1:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
public abstract class Employee//雇员抽象类
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public string Ssn { get; private set; }

public Employee(string first, string last, string ssn)
{
FirstName = first;
LastName = last;
Ssn = ssn;
}
public abstract decimal Earning();

public virtual int Time(int times)//抽象类可以写虚方法
{
return times;
}

public override string ToString()
{
return string.Format("FirstName:{0} LastName:{1} SSN:{2}", FirstName, LastName, Ssn);
}
}

public class SalariedEmployee : Employee//薪水雇员类
{
private decimal weeksalay;
public SalariedEmployee(string first, string last, string ssn, decimal salay)
: base(first, last, ssn)//调用抽象类的构造函数
{
Weeksalay = salay;
}

public decimal Weeksalay
{
get { return weeksalay; }
set
{
weeksalay = (value > 0) ? value : 0;
}
}

public override decimal Earning()
{
Weeksalay = Weeksalay* 7;
return Weeksalay;
}

public override string ToString()//如果不重写ToString方法那么继承的是抽象类的方法
{
return string.Format("{0} Weeksalay:{1}",base.ToString(), Weeksalay);
}
}

class HourEmployee : Employee//小时工类
{
private decimal wage;
private int hour;
public HourEmployee(string first, string last, string ssn, decimal hourwage, int hourtime)
: base(first, last, ssn)
{
Hour = hourtime;//注意这里,2个属性的前后顺序会决定了结果的
Wage = hourwage;



}
public decimal Wage
{
get { return wage; }
set
{
wage = (value > 0) ? value : 0;
}
}

public int Hour
{
get { return hour; }
set
{
hour = (value > 0) ? value : 0;
}
}

public override decimal Earning()
{
if (Hour <= 40)
{
Wage = Wage* Hour;
}
else
{
Wage = Wage* 40 + (Hour - 40) * Wage* 1.5m;
}
return Wage;
}

public override string ToString()
{
return string.Format("{0} Hourwage:{1} Hourtimes:{2},Wage:{3}", base.ToString(), Wage, Hour, Wage);//这里继承抽象类的ToString方法
}
}

class BaseHe_Employee : HourEmployee//间接继承抽象类
{
private decimal rate;
private decimal salay;
public BaseHe_Employee(string first, string last, string ssn, decimal hourwage, int hourtime, decimal rate, decimal salay)
: base(first, last, ssn, hourwage, hourtime)
{
Rate = rate;
Salay = salay;
}
public decimal Rate
{
get { return rate; }
set { rate = (value > 0) ? value : 0; }
}
public decimal Salay
{
get { return salay; }
set { salay = (value > 0) ? value : 0; }
}
public override decimal Earning()
{
return Salay+ base.Earning();
}

public override string ToString()
{
return string.Format("{0} Rate:{1},Salay:{2}", base.ToString(), Rate, Salay);//这里继承抽象类的ToString方法
}
}
class Test
{
static void Main()
{
//SalariedEmployee oneSE = new SalariedEmployee("Mr.w", "Mery An", "10086", 6500.00m);
//Console.WriteLine(oneSE.ToString());
BaseHe_Employee oneBHE = new BaseHe_Employee("Mr.w", "Mery An", "10086", 6.50m, 24, 15.5m, 16.5m);
Console.WriteLine(oneBHE.ToString());
Console.WriteLine(oneBHE.Earning());
//HourEmployee oneHE = new HourEmployee("Mr.w", "Mery An", "10086", 6.50m, 24);
//Console.WriteLine(oneHE.ToString());
//Console.WriteLine(oneHE.Earning());
}
}
}


运算符的重载(实现对象与对象相加)案例

posted @ 2011-12-23 09:37 IAmBetter_Mr.w 阅读(16) | 评论 (0) 编辑

一个经典的问题(构造函数调用+抽象类+间接继承抽象类)

posted @ 2011-12-22 11:32 IAmBetter_Mr.w 阅读(110) | 评论 (0) 编辑

抽象类那点事(一步步案例分析,为什么需要它)

posted @ 2011-12-21 18:54 IAmBetter_Mr.w 阅读(1102) | 评论 (8) 编辑

委托和Lambda那点事(一步步集合案例分析,为什么使用委托 3解)

posted @ 2011-12-20 14:36 IAmBetter_Mr.w 阅读(193) | 评论 (0) 编辑

重载构造函数+复用构造函数+原始构造与This引用的区别(一步步案例分析)

posted @ 2011-12-19 16:04 IAmBetter_Mr.w 阅读(201) | 评论 (3) 编辑

类的索引器<索引器可以像方法一样重载>(一步步集合案例分析)

posted @ 2011-12-19 13:51 IAmBetter_Mr.w 阅读(129) | 评论 (5) 编辑

LinQ的第一天(老规矩:还是案例分析,从简单到难)

posted @ 2011-12-16 16:58 IAmBetter_Mr.w 阅读(162) | 评论 (0) 编辑

数组的详解(一步步结合案例分析 数组的易错及疑难)

posted @ 2011-12-16 12:18 IAmBetter_Mr.w 阅读(152) | 评论 (1) 编辑

详解值类型与引用类型 结合ref (利用案例一步步分析内存的变化)

posted @ 2011-12-15 23:53 IAmBetter_Mr.w 阅读(1088) | 评论 (2) 编辑

GetType()与Typeof()的区别 举了2个案例

posted @ 2011-12-15 15:40 IAmBetter_Mr.w 阅读(229) | 评论 (0) 编辑

投掷6000次 1-6 出现的次数(已有3种解法)

posted @ 2011-12-15 13:36 IAmBetter_Mr.w 阅读(129) | 评论 (0) 编辑

续昨日 学习案例 -希望通过实际的案例帮助初学者

posted @ 2011-12-13 16:57 IAmBetter_Mr.w 阅读(51) | 评论 (0) 编辑

适合新手的案例

posted @ 2011-12-13 16:53 IAmBetter_Mr.w 阅读(18) | 评论 (0) 编辑

利用递归方法计算 阶乘

posted @ 2011-12-13 16:46 IAmBetter_Mr.w 阅读(143) | 评论 (0) 编辑

c#笔记 函数片段 (从易到难) 全是案例

posted @ 2011-12-13 10:24 IAmBetter_Mr.w 阅读(249) | 评论 (0) 编辑

C# 笔记 变量与类型转换(基础+总结)

posted @ 2011-12-02 16:48 IAmBetter_Mr.w 阅读(221) | 评论 (1) 编辑

C#笔记 函数(通俗易懂)

posted @ 2011-12-02 09:38 IAmBetter_Mr.w 阅读(215) | 评论 (0) 编辑

投掷100次掷子计算每个数出现的次数 C#源码案例 附第二种简单解法

posted @ 2011-12-02 08:52 IAmBetter_Mr.w 阅读(180) | 评论 (9) 编辑

C#条件运算符

posted @ 2011-12-02 08:50 IAmBetter_Mr.w 阅读(17) | 评论 (0) 编辑

2011.11.28 C#笔记

posted @ 2011-12-02 08:49 IAmBetter_Mr.w 阅读(753) | 评论 (8) 编辑

控制台-超市付费系统 源码

posted @ 2011-12-02 08:47 IAmBetter_Mr.w 阅读(333) | 评论 (2) 编辑

 

C# 使用委托调用待待闪屏。

以前总在博客园看别人写的博客,这是我第一次写技术博客,竟然不知道如何开始。在此向博客园里各位辛勤耕耘的各位博主致敬。

我以前开发Asp.net 程序较多,少有接触WinForm。最近调换了工作,也有机会接触WinForm.首先做WinForm的感觉像是客场作战,好多东西都不大熟悉。所以要加强努力。

废话少说,进入正题。首先说说场景:

程序开发难免会有大数据量操作,在操作大量数据时,有时候需用户等待,在这一段时间内既不想让用户点其它操作,又不像让用户感觉程序假死了。怎么办?对,就是要需使用一个等待的闪屏,告诉用户"数据读取中"旁边还有一个gif动画在转动。等到完成操作时,闪屏自动关闭。

接下来看看效果:

可能会有很多同学笑我了:这么简单的东西,还拿出来写?简单是简单了点儿,可是对于一个WinForm不熟悉的人来说却也费了不少周章。

再接下来是实现方式

1、简单的实体类。(PS:因为是个小Demo 这个实体就没怎么加注释,^_^)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections;

namespace Demo
{
public class Product
{
public int ProductID { set; get; }
public string ProductName { set; get; }
public int Count { set; get; }
public double Pice { set; get; }
public string Uint { set; get; }
}
}

2、等待闪屏:相对简单,没有代码。在窗体上拖了一个Lable控件 和一个PictureBox,把Lable的Text属性设置为:“数据读取中”并且改了一下字体样式,给PictureBox装载一个gif图像

3、主窗体:在主窗体上拉个网格控件(本Demo使用Developer Express的网格控件)、一个按钮:把按钮的Text属性改为 “读取”、一个BindingSource,
下面看主窗体的实现代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Data.Linq;
using System.Threading;

namespace devDemo
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
frmLoading loading = new frmLoading();//闪屏窗体

#region 委托
/// <summary>
/// 关闭闪屏
/// </summary>
public delegate void Closeloading();
/// <summary>
/// 绑定数据
/// </summary>
/// <param name="ls">数据列表</param>
public delegate void BindedData(List<Product> ls);
#endregion

private void FormMain_Load(object sender, EventArgs e)
{
}

/// <summary>
/// 读取按钮点击事件
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
new Action(ReadData).BeginInvoke(new AsyncCallback(CloseLoading), null);
loading.ShowDialog();//显示loading
}

/// <summary>
/// 读取数据
/// </summary>
public void ReadData()
{
List<Product> productList = new List<Product>();
//装载模拟数据
for (int i = 0; i < 15; i++)
{
productList.Add(new Product
{
ProductID = i + 1,
Count = new Random().Next(i * 10, 3000 / (i + 1)),
Pice = System.Math.Round(new Random().NextDouble() * (i + 1) * 100, 4),
Uint = "",
ProductName = string.Format("产品{0}", i)
});
Thread.Sleep(200);//每添加一条记录休息200毫秒
}

this.Invoke(new BindedData((pls) => {
//绑定数据
this.protuctBindingSource.DataSource = pls;
}),productList);
}

/// <summary>
/// 关闭loading
/// </summary>
/// <param name="ar"></param>
public void CloseLoading(IAsyncResult ar)
{
this.Invoke(new Closeloading(() => { loading.Close(); }));
}
}
}

至此这个Demo完成.若有不足之处,或是有更好的方式,欢迎提出。

另外,写技术博客真不容易。佩服那些一直更新自己博客的老师们。

原文地址:https://www.cnblogs.com/Leo_wl/p/2299030.html