首页 > 其他分享 >泛型,泛型约束

泛型,泛型约束

时间:2024-12-27 16:56:58浏览次数:3  
标签:Console void public 泛型 new 约束 class

什么是泛型?

泛型(Generics) 是一种编程技术,广泛应用于面向对象编程(OOP)中,特别是在C#、Java等现代编程语言中。泛型的核心思想是创建可以在多种数据类型上工作的类、接口和方法,而不需要为每种数据类型单独编写代码。这不仅提高了代码的重用性,还增强了类型安全性,减少了运行时错误。

泛型的主要优点

  1. 类型安全性:
    • 泛型在编译时进行类型检查,确保类型的一致性,减少运行时类型转换错误。
  2. 代码重用:
    • 通过泛型,可以编写适用于多种数据类型的通用代码,而不需要为每种数据类型编写单独的实现。
  3. 性能提升:
    • 泛型避免了装箱(boxing)和拆箱(unboxing)操作,提高了性能,特别是在处理值类型时。
  4. 可读性和可维护性:
    • 泛型代码更易于阅读和维护,因为类型信息在编译时就已经明确。

泛型的实现

  1. 泛型类:
    定义一个类,使其可以处理多种数据类型的实例。

     public class Box<T>
     {
     	private T _content;
    
     	public void SetContent(T content)
     	{
     		_content = content;
     	}
    
     	public T GetContent()
     	{
     		return _content;
     	}
     }
    
     public class Program
     {
     	public static void Main()
     	{
     		Box<int> intBox = new Box<int>();
     		intBox.SetContent(42);
     		Console.WriteLine(intBox.GetContent()); // 输出: 42
    
     		Box<string> stringBox = new Box<string>();
     		stringBox.SetContent("Hello, World!");
     		Console.WriteLine(stringBox.GetContent()); // 输出: Hello, World!
     	}
     }
    
  2. 泛型接口:
    定义一个接口,使其可以处理多种数据类型的实例。

     public interface IStorage<T>
     {
     	void Store(T item);
     	T Retrieve();
     }
    
     public class Storage<T> : IStorage<T>
     {
     	private T _item;
    
     	public void Store(T item)
     	{
     		_item = item;
     	}
    
     	public T Retrieve()
     	{
     		return _item;
     	}
     }
    
     public class Program
     {
     	public static void Main()
     	{
     		IStorage<int> intStorage = new Storage<int>();
     		intStorage.Store(100);
     		Console.WriteLine(intStorage.Retrieve()); // 输出: 100
    
     		IStorage<string> stringStorage = new Storage<string>();
     		stringStorage.Store("Generic Storage");
     		Console.WriteLine(stringStorage.Retrieve()); // 输出: Generic Storage
     	}
     }
    
  3. 泛型方法:
    定义一个方法,使其可以处理多种数据类型的参数和返回值。

     public class GenericMethods
     {
     	public static T GetDefault<T>() where T : new()
     	{
     		return new T();
     	}
    
     	public static void Print<T>(T item)
     	{
     		Console.WriteLine(item);
     	}
     }
    
     public class Program
     {
     	public static void Main()
     	{
     		int defaultInt = GenericMethods.GetDefault<int>();
     		Console.WriteLine(defaultInt); // 输出: 0
    
     		string defaultString = GenericMethods.GetDefault<string>();
     		Console.WriteLine(defaultString); // 输出: (空字符串)
    
     		GenericMethods.Print(42); // 输出: 42
     		GenericMethods.Print("Hello, World!"); // 输出: Hello, World!
     	}
     }
    
  4. 泛型约束:
    可以为泛型类、接口和方法添加约束,以限制泛型参数的类型。
    常见的约束包括:

    • where T : new():要求泛型参数必须有一个无参构造函数。

    • where T : class:要求泛型参数必须是引用类型。

    • where T : struct:要求泛型参数必须是值类型。

    • where T : IInterface:要求泛型参数必须实现特定的接口。

    • where T : BaseClass:要求泛型参数必须继承自特定的基类。

        public class GenericConstraint<T> where T : new()
        {
        	public T CreateInstance()
        	{
        		return new T();
        	}
        }
      
        public class MyClass
        {
        	public void MyMethod()
        	{
        		Console.WriteLine("MyClass instance created.");
        	}
        }
      
        public class Program
        {
        	public static void Main()
        	{
        		GenericConstraint<MyClass> constraint = new GenericConstraint<MyClass>();
        		MyClass instance = constraint.CreateInstance();
        		instance.MyMethod(); // 输出: MyClass instance created.
        	}
        }
      
  5. 泛型的应用场景
    1.集合类:
    泛型集合类(如List<T 、Dictionary<TKey, TValue)提供了类型安全的集合操作。

     	List <int numbers = new List <int();
     	numbers.Add(1);
     	numbers.Add(2);
     	numbers.Add(3);
    
     	foreach (int number in numbers)
     	{
     		Console.WriteLine(number); // 输出: 1 2 3
     	}
    

2.算法和数据结构:
算法和数据结构:

	public class Stack<T>
	{
		private List<T> _elements = new List<T>();

		public void Push(T item)
		{
			_elements.Add(item);
		}

		public T Pop()
		{
			if (_elements.Count == 0)
			{
				throw new InvalidOperationException("Stack is empty.");
			}
			T item = _elements[_elements.Count - 1];
			_elements.RemoveAt(_elements.Count - 1);
			return item;
		}

		public T Peek()
		{
			if (_elements.Count == 0)
			{
				throw new InvalidOperationException("Stack is empty.");
			}
			return _elements[_elements.Count - 1];
		}
	}

	public class Program
	{
		public static void Main()
		{
			Stack<int> intStack = new Stack<int>();
			intStack.Push(1);
			intStack.Push(2);
			Console.WriteLine(intStack.Pop()); // 输出: 2

			Stack<string> stringStack = new Stack<string>();
			stringStack.Push("Hello");
			stringStack.Push("World");
			Console.WriteLine(stringStack.Pop()); // 输出: World
		}
	}

3.工厂模式
泛型可以用于实现工厂模式,创建不同类型的对象。

	public class Factory<T> where T : new()
	{
		public T Create()
		{
			return new T();
		}
	}

	public class Product
	{
		public void Display()
		{
			Console.WriteLine("Product displayed.");
		}
	}

	public class Service
	{
		public void Execute()
		{
			Console.WriteLine("Service executed.");
		}
	}

	public class Program
	{
		public static void Main()
		{
			Factory<Product> productFactory = new Factory<Product>();
			Product product = productFactory.Create();
			product.Display(); // 输出: Product displayed.

			Factory<Service> serviceFactory = new Factory<Service>();
			Service service = serviceFactory.Create();
			service.Execute(); // 输出: Service executed.
		}
	}

标签:Console,void,public,泛型,new,约束,class
From: https://www.cnblogs.com/chenshibao/p/18636155

相关文章

  • C#知识整理-泛型
    泛型是为所存储或使用的一个或多个类型具有占位符(类型形参)的类、结构、接口和方法。泛型集合类可以将类型形参用作其存储的对象类型的占位符;类型形参呈现为其字段的类型和其方法的参数类型。泛型方法可将其类型形参用作其返回值的类型或用作其形参之一的类型。泛型的优点包括:代......
  • Scala入门基础(28)泛型
    一.泛型二.泛型类三.泛型特质一.泛型需求:定义一个函数,用来将Array中的中间位置的元素值返回Array:表示是一个数组[Int]:表示数组中的元素是整形泛型函数:在定义函数的时候,把参数的类型提取出来,变成一个参数,用[]包起来(演示)泛型是对Array这个数据内部的元素的类型的......
  • Scala入门基础(29)泛型界定
    一.泛型的边界二.泛型的上下界三.泛型的上界四.泛型的下界一.泛型的边界.求list中最大元素需要类型的限定 二.泛型的上下界泛型的上界,下界,对类型的更加具体的约束//爷爷>叔叔>兄弟如果给某个泛型设置了上界:这里的类型必须是上界,及其子类如果给某个泛型设置了下......
  • Java 泛型详细解析
    泛型的定义泛型类的定义下面定义了一个泛型类Pair,它有一个泛型参数T。publicclassPair<T>{ privateTstart; privateTend;}实际使用的时候就可以给这个T指定任何实际的类型,比如下面所示,就指定了实际类型为LocalDate,泛型给了我们一个错觉就是通过个这个模板类P......
  • 【Java基础面试题035】什么是Java泛型的上下界限定符?
    回答重点Java泛型的上下界限定符用于对泛型类型参数进行范围限制,主要有上界限定符和下届限定符。1)上界限定符(?extendsT):定义:通配符?的类型必须是T或者T的子类,保证集合元素一定是T或者T的子类作用:通常用于读取操作,通配符?类型必须是T/T的子类,然后集合元素也必须是T/T的子......
  • 一种基于机会约束规划
    一种基于机会约束规划(ChanceConstrainedProgramming)的模型,通常应用于解决那些约束条件中含有随机变量,且必须在预测到随机变量的实现之前作出决策的优化问题。以下是对基于机会约束规划模型的详细解释:一、概念与定义机会约束规划是由查纳斯(A.Charnes)和库伯(W.W.Cooper)提出的,是一......
  • 12. 泛型常用特点
    泛型是JavaSE1.5之后的特性,《Java核心技术》中对泛型的定义是:“泛型”意味着编写的代码可以被不同类型的对象所重用。“泛型”,顾名思义,“泛指的类型”。我们提供了泛指的概念,但具体执行的时候却可以有具体的规则来约束,比如我们用的非常多的ArrayList就是个泛型类,ArrayList......
  • 差分约束系统
    差分约束用于求有\(n\)个变量,\(m\)条限制,每条限制只与两个变量的差有关的问题的一组解。一般可以转化为最短路或者最长路解决。最短路:用三角形不等式\(dis_v\ledis_u+w\)来保证解合法,这样一条不等式等价于\(x_v\lex_u+w\)。最长路:类似最短路,用\(dis_v\gedis_u+w\)来保证解......
  • 【差分约束】学习笔记
    BasicTips差分约束,即为存在一个差分约束系统,即类似\(x_i-x_j\leqk\)的\(n\)元一次不等式组,求出一组解使得该组内所有不等式全部成立,即\(x_1=s_1,x_2=s_2\dotsx_n=s_n\),否则判无解。对于满足条件的一个解集\(\{s_1,s_2,s_3,\dots,s_n\}\),集合\(\{s_1+t,s_2......
  • 【老白学 Java】泛型应用 - 卡拉 OK(三)
    泛型应用-卡拉OK(三)文章来源:《HeadFirstJava》修炼感悟。上文说到,正当老白为编译错误焦头烂额时,事情有了转机。老白在API中找到了答案,终于弄清楚了v3.0编译错误的原因。为了以后不会忘记,特地在这里留下记录方便随时翻看。一、原来是泛型惹的「祸」为了保证集......