Interfaz de notas de estudio de C #

interfaz

La interfaz en C # es sintácticamente similar a una clase abstracta. Define varios métodos abstractos, atributos, indexadores y eventos para formar una colección de miembros abstractos. Cada miembro normalmente refleja ciertas cosas. Función de aspecto. Una interfaz es esencialmente un acuerdo sobre ciertas funciones o características.
La utilidad de la interfaz en el programa se refleja principalmente en los siguientes aspectos:

  • El mismo comportamiento de clases no relacionadas se puede lograr a través de interfaces, sin necesidad de considerar la relación jerárquica entre estas clases.
  • A través de la interfaz, puede especificar los métodos que deben implementar varias clases.
  • A través de la interfaz, puede comprender la interfaz interactiva del objeto sin conocer la clase correspondiente al objeto.

Definir la interfaz

Defina la interfaz mediante interfacepalabras clave. Puede haber varios miembros en la interfaz.
Los miembros de una interfaz deben ser métodos abstractos , propiedades, eventos o indexadores, y estos miembros abstractos no tienen cuerpo de implementación. Una interfaz no puede contener constantes, campos, operadores, constructores, constructores estáticos o tipos anidados, ni puede incluir miembros estáticos de ningún tipo.
Todos los miembros de la interfaz son implícitamente accesibles al público, es decir, implícitamente sí public. Sin embargo, no se pueden usar newmodificadores distintos a esos en las declaraciones de miembros de la interfaz . Sin embargo, la propia interfaz puede tomar modificadores, tales como public, interface. De acuerdo con las convenciones de codificación, los nombres de las interfaces comienzan con una letra I mayúscula. ejemplo:

public interface IStringList
{
    
    
	void Add(string s);
	int Count{
    
    get;}
	string this[int index]{
    
    get; set;}
}

Esta interfaz contiene un método, una propiedad y un indexador.


Una interfaz puede heredar de una o más interfaces base (interfaces principales). ejemplo:

interface IMyInterface:IBase1, IBase2
{
    
    
	void MethodA();
	void MethodB();
}

La subinterfaz heredará todas las propiedades y métodos de la interfaz principal. También puede utilizar newmodificadores para ocultar miembros en la interfaz principal.
Por ejemplo, la siguiente definición System.Collections.IList:

public interface IList:ICollection, IEnumerable
{
    
    
	bool IsFixedSize{
    
    get;}
	bool IsReadOnly{
    
    get;}
	object this[int index]{
    
    get; set;}
	int Add(object value);
	void Clear();
	bool Contains(object value);
	int IndexOf(object value);
	void Insert(int index, object value);
	void Remove(object value);
	void RemoveAt(int index);
}	

Implementar la interfaz

La declaración de la interfaz solo proporciona métodos abstractos, lo que equivale a un conjunto de protocolos en la etapa inicial del desarrollo del programa. Para realizar específicamente las funciones especificadas por la interfaz, una determinada clase necesita escribir declaraciones para los métodos abstractos en la interfaz. y definir el cuerpo del método real.
Las interfaces se pueden implementar mediante clases o estructuras. El siguiente es el formato de usar una clase para implementar una interfaz:

class 类名:[父类,] 接口, 接口, ..., 接口 
{
    
    
	...
}

Cuando una clase implementa una interfaz, preste atención a los siguientes problemas:

  • En la parte de declaración de la clase, use dos puntos ( :) para indicar su clase principal y la interfaz a implementar, donde la clase principal debe colocarse delante del nombre de la interfaz. Si se omite la clase principal, la clase principal implícita es System.Object.
  • Si una clase implementa una interfaz, debe poder encontrar los miembros correspondientes a cada miembro de la interfaz en la clase y también encontrar todos los miembros de todas las interfaces principales de la interfaz. Por supuesto, dichos miembros pueden definirse en esta clase o heredarse de la clase padre de esta clase.
  • Cuando una clase abstracta implementa una interfaz, también se requiere que proporcione programas de implementación para todos los miembros La clase abstracta puede asignar métodos de interfaz a métodos abstractos.
  • Una clase solo puede tener una clase principal, pero puede implementar varias interfaces al mismo tiempo. Cuando una clase implementa múltiples interfaces, si la interfaz se entiende como una clase especial, entonces esta clase en realidad obtiene múltiples clases padre usando la interfaz, es decir, se realiza una herencia múltiple.
  • Preste especial atención al control de acceso implícito de los métodos abstractos de la interfaz public, por lo que la clase debe usar publicmodificadores al implementar métodos .

Ejemplo:

using System;

namespace ConsoleApp3接口
{
    
    
	interface Runner
	{
    
    
		void run ();
	}
	interface Swimmer
	{
    
    
		void swim ();
	}
	abstract class Animal
	{
    
    
		abstract public void eat ();
	}

	class Person : Animal, Runner, Swimmer
	{
    
    
		public void run () {
    
    
			Console.WriteLine ("run");
		}
		public void swim () {
    
    
			Console.WriteLine ("swim");
		}
		public override void eat () {
    
    
			Console.WriteLine ("eat");
		}
		public void speak () {
    
    
			Console.WriteLine ("speak");
		}
	}

	class TestInterface
	{
    
    
		static void m1 (Runner r) {
    
    
			r.run ();
		}
		static void m2 (Swimmer s) {
    
    
			s.swim ();
		}
		static void m3 (Animal a) {
    
    
			a.eat ();
		}
		static void m4 (Person p) {
    
    
			p.speak ();
		}
		public static void Main (string[] args) {
    
    
			Person p = new Person ();
			m1 (p);
			m2 (p);
			m3 (p);
			m4 (p);

			Runner a = new Person ();
			a.run ();
		}
	}
}

Referencia a la interfaz

La interfaz se puede utilizar como un tipo de referencia y se puede acceder a los métodos de la interfaz implementados por la clase a través de estas variables de referencia. Por ejemplo: si la Personclase está implementada ISwimmable, puede referirse al Personobjeto como ISwimmable:

	Person p = new Person();
	ISwimmable s = p;

De manera similar, si un método requiere una interfaz como parámetro, puede pasar directamente un objeto de instancia de una clase que implementa la interfaz. La interfaz como tipo de datos no necesita conocer la clase específica correspondiente al objeto, sino que se centra en su interfaz o función interactiva.
Una interfaz puede tener varias interfaces principales y los miembros de la interfaz pueden tener el mismo nombre, por lo que, al llamar a los miembros de la interfaz, puede haber ambigüedad. P.ej:

interface IList
{
    
    
	int Count{
    
    get; set;}
}
interface ICounter
{
    
    
	void Count(int i);
}
interface IListCounter : IList, ICounter{
    
    }
class C
{
    
    
	void Test(IListCounter x){
    
    
		x.Count(1);				// Error, Count不明确
		x.Count = 1;			// Error, Count不明确
		((IList)x).Count = 1;	// Ok, 调用IList.Count.set
		((ICounter)x).Count(1);	// Ok, 调用ICounter.Count
	}
}

Mostrar la implementación del miembro de la interfaz

A veces, múltiples interfaces tienen el mismo método de firma (u otros miembros). Si una clase necesita implementar múltiples interfaces al mismo tiempo, puede usar solo un método para cumplir con los requisitos de cada interfaz. Sin embargo, en más casos, el significado de estos mismos métodos de firma en cada interfaz no es el mismo, por lo que cuando la clase implementa cada interfaz, es necesario mostrar el método en el que implementa la interfaz. P.ej:

using System;

namespace ConsoleApp3接口
{
    
    
	class InterfaceExplicitImpl
	{
    
    
		static void Main (string[] args) {
    
    
			FileViewer f = new FileViewer ();
			f.Test ();
			((IWindow)f).Close ();

			IWindow w = new FileViewer ();
			w.Close ();
		}
	}
	
	interface IWindow
	{
    
    
		void Close ();
	}
	interface IFileHander
	{
    
    
		void Close ();
	}
	class FileViewer : IWindow, IFileHander
	{
    
    
		void IWindow.Close () {
    
    
			Console.WriteLine ("Window Closed");
		}

		void IFileHander.Close () {
    
    
			Console.WriteLine ("File Closed");
		}

		public void Test () {
    
    
			((IWindow)this).Close ();
		}
	}
}

Puede verse por lo anterior que el programa de implementación del miembro de la interfaz de visualización tiene características de capacidad de acceso diferentes en comparación con otros miembros. Debido a que los miembros de la interfaz de visualización no se pueden llamar a través de instancias de clase, en este sentido son privados; por otro lado, se puede acceder a ellos a través de una instancia de interfaz, en este sentido, son públicos.

La realización de miembros de la interfaz de pantalla tiene principalmente dos propósitos:

  • Porque muestra que no se puede acceder a los miembros de la interfaz a través de la instancia de clase o estructura, sino que solo se permite a través de la interfaz, por lo que a menudo se usa para describir la situación en la que solo se puede acceder a la interfaz.
  • El programa de implementación de miembros de la interfaz de pantalla permite la misma firma para eliminar la ambigüedad de los miembros de la interfaz, de modo que una clase o estructura puede contener miembros con la misma firma pero diferentes tipos de retorno.

Supongo que te gusta

Origin blog.csdn.net/qq_45349225/article/details/113965436
Recomendado
Clasificación