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


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.