Cómo implementar una propiedad en una interfaz


135

Tengo una interfaz que IResourcePolicycontiene la propiedad Version. Tengo que implementar esta propiedad que contiene valor, el código escrito en otras páginas:

IResourcePolicy irp(instantiated interface)
irp.WrmVersion = "10.4";

¿Cómo puedo implementar la propiedad version?

public interface IResourcePolicy
{
   string Version
      {
          get;
          set;
      }
}

1
¿Por qué quieres implementar algo en la interfaz? Ahí solo especificas la interfaz ...
Stefan Steinegger

Respuestas:


296

En la interfaz, especifique la propiedad:

public interface IResourcePolicy
{
   string Version { get; set; }
}

En la clase de implementación, debe implementarlo:

public class ResourcePolicy : IResourcePolicy
{
   public string Version { get; set; }
}

Esto se ve similar, pero es algo completamente diferente. En la interfaz, no hay código. Simplemente especifica que hay una propiedad con un captador y un establecedor, independientemente de lo que hagan.

En la clase, en realidad los implementas. La forma más corta de hacerlo es usar esta { get; set; }sintaxis. El compilador creará un campo y generará la implementación getter y setter para él.


¿Cómo se dice que Versiones público en la clase? Ahh, veo mi problema: si implementa la interfaz explícitamente (por ejemplo IResourcePolicy.Version, no puede definir si es pública.)
PeterX

55
Tienes razón, debería ser público. Lo arreglé. No me importó mucho esto, porque no es relevante para las cosas que intenté explicar.
Stefan Steinegger

77
¡Por supuesto que es relevante! Si desea ofrecer una buena respuesta, debe hacerlo simple para las personas. Para que no tropiecen con el siguiente problema.
Bitterblue

21

¿Quieres decir así?

class MyResourcePolicy : IResourcePolicy {
    private string version;

    public string Version {
        get {
            return this.version;
        }
        set {
            this.version = value;
        }
    }
}

1
esto lo sé, pero ya asigné valores tales que irp.WrmVersion = "10.4"; vea mi pregunta, no necesito perder ese valor, tengo que pasarlo
Peter

16

Las interfaces no pueden contener ninguna implementación (incluidos los valores predeterminados). Necesitas cambiar a la clase abstracta.


Eso es, ¿cómo puedo implementar esta propiedad en otro lugar
Peter el

crear un @petr clase que implementa la interfaz, de crear una instancia de esa clase y asignar a la variable que tienen el tipo de interfaz
Arsen Mkrtchyan

44
Yo votaría por la primera oración. Pero las clases base abstractas siempre deben evitarse si una interfaz es suficiente. Entonces, antes de saber qué problema debería resolverse realmente, no debe sugerir crear una clase base.
Stefan Steinegger

2
@Stefan, con la segunda oración quise decir que si realmente necesita un valor predeterminado para ser introducido, entonces debería usar la clase abstracta.
Vitaliy Liptchinsky

1

El ejemplo simple de usar una propiedad en una interfaz:

using System;
interface IName
{
    string Name { get; set; }
}

class Employee : IName
{
    public string Name { get; set; }
}

class Company : IName
{
    private string _company { get; set; }
    public string Name
    {
        get
        {
            return _company;
        }
        set
        {
            _company = value;
        }   
    }
}

class Client
{
    static void Main(string[] args)
    {
        IName e = new Employee();
        e.Name = "Tim Bridges";

        IName c = new Company();
        c.Name = "Inforsoft";

        Console.WriteLine("{0} from {1}.", e.Name, c.Name);
        Console.ReadKey();
    }
}
/*output:
 Tim Bridges from Inforsoft.
 */

0
  • pero ya asigné valores tales que irp.WrmVersion = "10.4";

Respuesta de J.Random Coder e inicializar el campo de versión.


private string version = "10.4';

0

Debe usar la clase abstracta para inicializar una propiedad. No se puede iniciar en Inteface.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.