Как реализовать свойство в интерфейсе


135

У меня есть интерфейс, IResourcePolicyсодержащий свойство Version. Я должен реализовать это свойство, которое содержит значение, код, написанный на других страницах:

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

Как я могу реализовать собственность version?

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

1
почему вы хотите что-то реализовать в интерфейсе? Там вы просто указываете интерфейс ...
Stefan Steinegger

Ответы:


296

В интерфейсе вы указываете свойство:

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

В реализующем классе вам необходимо реализовать его:

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

Это выглядит похоже, но это нечто совершенно другое. В интерфейсе нет кода. Вы просто указываете, что есть свойство с геттером и сеттером, что бы они ни делали.

В классе вы фактически реализуете их. Самый короткий способ сделать это - использовать этот { get; set; }синтаксис. Компилятор создаст поле и сгенерирует реализацию getter и setter для него.


Как вы говорите, что Versionпублично в классе? Ах, я вижу свою проблему: если вы реализуете Интерфейс явно (например IResourcePolicy.Version, вы не можете определить, является ли он общедоступным.
PeterX

5
Вы правы, это должно быть публично. Я починил это. Мне было все равно, потому что это не имеет отношения к вещам, которые я пытался объяснить.
Стефан Штайнеггер

7
Конечно это актуально! Если вы хотите дать хороший ответ, вы должны сделать его простым для людей. Поэтому они не натыкаются на следующую проблему.
Bitterblue

21

Вы имеете в виду, как это?

class MyResourcePolicy : IResourcePolicy {
    private string version;

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

1
это я знаю ,, но я уже назначил значения, такие, что irp.WrmVersion = "10.4"; см. мой вопрос ,, мне не нужно терять это значение ,, я должен передать его
Питер

16

Интерфейсы не могут содержать какую-либо реализацию (включая значения по умолчанию). Вам нужно переключиться на абстрактный класс.


Вот что, как я могу реализовать это свойство где-то еще
Питер

создайте класс @petr, который реализует этот интерфейс, а затем создайте экземпляр для этого класса и назначьте переменную, которая имеет тип интерфейса
Арсен Мкртчян

4
Я бы проголосовал за первое предложение. Но абстрактных базовых классов всегда следует избегать, если интерфейса достаточно. Поэтому, прежде чем вы знаете, какую проблему на самом деле нужно решить, не стоит предлагать создать базовый класс.
Стефан Штайнеггер

2
@Stefan, под вторым предложением я имел в виду, что если ему действительно нужно ввести значение по умолчанию, то ему следует использовать абстрактный класс.
Виталий Липчинский

1

Простой пример использования свойства в интерфейсе:

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
  • но я уже присвоил такие значения, что irp.WrmVersion = "10.4";

J.Random Кодер отвечает и инициализирует поле версии.


private string version = "10.4';

0

Вы должны использовать абстрактный класс для инициализации свойства. Вы не можете инициировать в Inteface.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.