Як реалізувати властивість в інтерфейсі


135

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

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

Як я можу реалізувати майно version?

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

1
чому ви хочете що-небудь реалізувати в інтерфейсі? Там ви просто вкажіть інтерфейс ...
Стефан Штейнеггер

Відповіді:


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"; дивіться моє запитання ,, мені не потрібно втрачати цю цінність ,, я повинен його передати
peter

16

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


Ось що, як я можу реалізувати цю властивість десь в іншому місці
peter

створити клас @petr, який реалізує цей інтерфейс, ніж створити екземпляр для цього класу та призначити змінну, яка має тип інтерфейсу
Арсен Мкртчян

4
Я б проголосував за перше речення. Але абстрактних базових класів завжди слід уникати, якщо інтерфейсу достатньо. Отже, перш ніж знати, яку проблему насправді слід вирішити, не слід пропонувати створювати базовий клас.
Стефан Штейнеггер

2
@ Стефан, другим реченням я мав на увазі, що якщо йому дійсно потрібно ввести значення за замовчуванням, то він повинен використовувати абстрактний клас.
Віталій Липчинський

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 Coder та ініціалізувати поле версії.


private string version = "10.4';

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.