阿里云网站备案幕布,免费推广网站地址大全,应用小程序定制开发,网站swf怎么做文章目录 前言模拟需求场景模拟重复性高的需求初始类结构继承优化抽象类 需求1#xff1a;打印CreateTime方法1#xff1a;使用重载方法2#xff1a;基类函数方法3#xff1a;泛型约束方法3.1#xff1a;普通泛型方法方法3.2#xff1a;高级泛型约束#xff0c;扩展方法… 文章目录 前言模拟需求场景模拟重复性高的需求初始类结构继承优化抽象类 需求1打印CreateTime方法1使用重载方法2基类函数方法3泛型约束方法3.1普通泛型方法方法3.2高级泛型约束扩展方法 总结 番外篇泛型方法和接口泛型约束抽象接口 总结 前言
以前计算机本科学习的时候我就知道了继承重载接口抽象泛型等概念。本章优先讲解继承接口抽象泛型这一组概念。如果说继承抽象只是为了标准化代码规范程序编写的话那么泛型约束就是给于了继承抽象这个写法的必要性。 c# 继承 浅谈C#中的抽象类(abstract)和接口(interface) C#泛型约束 模拟需求
因为我干的是上位机工作这里我就讲解一下我用到的场景。上位机的代码重复性很高泛型约束就是用于解决此类问题。
场景模拟
我是A公司我有多种(为了简单按两种算)产品这2种产品有一下两个特质
每个产品存数据库的字段有完全相同的3个字段 Id:数据库IdDeivceId:设备唯一Id全部种类产品唯一的Id。CreateTime:数据录入数据库时间
重复性高的需求
我们现在有个需求给每个类添加一个打印CreateTime的方法
初始类结构 public class DeviceA{public string DeviceId { get; set; }public long Id { get; set; } public DateTime CreateTime { get; set; }public string ValueA { get; set; }}public class DeviceB{public string DeviceId { get; set; }public long Id { get; set; }public DateTime CreateTime { get; set; }public string ValueB { get; set; }}继承优化
继承的目的就是为了减少重复的字段
public class DeviceA:DeviceBase
{public string ValueA { get; set; }
}public class DeviceB : DeviceBase
{public string ValueB { get; set; }}
/// summary
/// 使用基类优化代码
/// /summary
public class DeviceBase
{public string DeviceId { get; set; }public long Id { get; set; }public DateTime CreateTime { get; set; }
}抽象类
我们也可以在基类上面添加abstract关键字
public abstract class DeviceBase
{public string DeviceId { get; set; }public long Id { get; set; }public DateTime CreateTime { get; set; }}区别就是抽象类无法实例化
那么抽象类的意义就是为了告诉你我的基类是没有任何实际意义的我单纯就是为了继承用的
需求1打印CreateTime
方法1使用重载
static void Main(string[] args)
{var DeviceA new DeviceA() { CreateTime DateTime.Now};var DeviceB new DeviceB() { CreateTime DateTime.Now };PrintCreateTime(DeviceA);PrintCreateTime(DeviceB);
}
public static void PrintCreateTime(DeviceA deviceA)
{Console.WriteLine(${deviceA.CreateTime});
}public static void PrintCreateTime(DeviceB deviceB)
{Console.WriteLine(${deviceB.CreateTime});
}方法2基类函数
internal class Program
{static void Main(string[] args){var DeviceA new DeviceA() { CreateTime DateTime.Now};var DeviceB new DeviceB() { CreateTime DateTime.Now };DeviceA.PrintCreateTime();DeviceB.PrintCreateTime();}}/// summary
/// 使用基类优化代码
/// /summary
public class DeviceBase
{·······public void PrintCreateTime(){Console.WriteLine(CreateTime.ToString());}
}方法3泛型约束
方法3.1普通泛型方法 static void Main(string[] args){var DeviceA new DeviceA() { CreateTime DateTime.Now};var DeviceB new DeviceB() { CreateTime DateTime.Now };PrintCreateTime(DeviceA);PrintCreateTime(DeviceB);}/// summary/// 泛型约束DeviceBase基类/// /summary/// typeparam nameT/typeparam/// param namemodel/parampublic static void PrintCreateTimeT(T model)where T : DeviceBase{Console.WriteLine(model.CreateTime.ToString());}方法3.2高级泛型约束扩展方法 C#小轮子扩展方法 internal class Program
{static void Main(string[] args){var DeviceA new DeviceA() { CreateTime DateTime.Now};var DeviceB new DeviceB() { CreateTime DateTime.Now };DeviceA.PrintCreateTime();DeviceB.PrintCreateTime();}}public static class DeviceExtension
{/// summary/// 扩展方法是更高级的泛型方法,但是需要一个静态类扩展/// /summary/// typeparam nameT/typeparam/// param namemodel/parampublic static void PrintCreateTimeT(this T model) where T : DeviceBase{Console.WriteLine(model.CreateTime.ToString());}
}总结
优点缺点重载更灵活每个类都可以定制重复性高基类方法降低重复度耦合度高过多会导致基类臃肿不符合属性类规范泛型约束降低重复度耦合度低易于扩展。不能访问基类以外的属性扩展方法最强的扩展性完美代替基类方法需要单独一个静态类 属性类是我自己的规范。就是基础的属性类只有属性和构造函数没有方法。 番外篇泛型方法和接口
有些时候我们设备类的逻辑特别的复杂比如每个产品都有四个方法
连接发送接受关闭连接
public interface IDevice
{public void Connect();public void Send();public void Recive();public void Close();}
public class DeviceA : DeviceBase, IDevice
{public string ValueA { get; set; }public void Close(){throw new NotImplementedException();}public void Connect(){throw new NotImplementedException();}public void Recive(){throw new NotImplementedException();}public void Send(){throw new NotImplementedException();}
}public class DeviceB : DeviceBase, IDevice
{public string ValueB { get; set; }public void Close(){throw new NotImplementedException();}public void Connect(){throw new NotImplementedException();}public void Recive(){throw new NotImplementedException();}public void Send(){throw new NotImplementedException();}
}泛型约束抽象接口
static void Main(string[] args)
{var DeviceA new DeviceA() { CreateTime DateTime.Now};var DeviceB new DeviceB() { CreateTime DateTime.Now };GetData(DeviceA);GetData(DeviceB);
}/// summary
/// 泛型约束也可以约束接口
/// /summary
/// typeparam nameT/typeparam
/// param namemodel/param
public static void GetDataT(T model) where T : IDevice
{model.Connect();model.Send();model.Recive();model.Close();
}
总结
不是说只能用泛型约束去解决问题而且泛型约束和扩展方法更具有扩展性低耦合的特点。大家可以根据自己代码的习惯选择性的使用。