C# - Разъяснение свойства

В XSLT 1.0 upper-case() и lower-case() функции не доступны. При использовании 1,0 таблиц стилей, общепринятая методика замены регистра translate():

<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />


<xsl:template match="/">
  <xsl:value-of select="translate(doc, $lowercase, $uppercase)" />
</xsl:template>
5
задан jason 8 September 2009 в 15:51
поделиться

7 ответов

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

class C1 : IFoo {
  public string SayHello {
    get { return "Say Hello"; }
    set { }
  }
}
13
ответ дан 18 December 2019 в 05:40
поделиться

В объявлении свойства в интерфейсе говорится, что любой реализующий класс должен иметь такие методы ( get_SayHello и set_SayHello , но определены как свойства), но имеют не уточняю, как они реализованы. То есть интерфейс говорит о том, что вы можете делать, а теперь о том, как это делается (так что вы можете получить «строку» SayHello , и вы можете установить «строку» SayHello ) . Итак, чтобы быть конкретным: определение свойства в интерфейсе ничего не говорит о поддерживающих полях.

Кроме того, это неправильное представление о том, что свойства должны иметь поддерживающие поля. Следующее не работает:

class Example {
    public string SayHello {
        get {
            return "Hello, World!"; 
        } 
        set { }
    }
}

Свойства - это просто методы, доступные через полевой синтаксис. Поскольку они являются методами, а не полями, их можно определить как интерфейс.

6
ответ дан 18 December 2019 в 05:40
поделиться

Как сказал Джаред, свойство не обязательно нуждается в каком-либо месте хранения ... но я думаю, вы все еще слишком задумываетесь над этим.

Представьте, что ваш интерфейс был на самом деле:

public interface IFoo
{
   string get_SayHello();
   string set_SayHello(string value);
}

Просто методы в интерфейсе. Вы довольны этим? Если это так, то это действительно все, что есть свойство, вместе с небольшим количеством метаданных, чтобы связать эти методы вместе. Ничего общего с полями ... только методы.

Разработчик может захотеть использовать поле, но оно полностью отделено от интерфейса.

4
ответ дан 18 December 2019 в 05:40
поделиться

Объявление такого свойства в интерфейсе просто означает, что любые классы вы определяете, что реализация интерфейса требуется для реализации этого свойства. Эти классы могут свободно реализовывать свойство любым способом, который вы сочтете нужным (либо как автоматические свойства, либо с помощью других более сложных средств).

Изменение вашего свойства в интерфейсе на следующее:

string SayHello { get; }

Реализующие классы являются только требуется для реализации получателя для этого свойства. Но на уровне интерфейса не происходит выделения памяти.

3
ответ дан 18 December 2019 в 05:40
поделиться

У меня все еще вопрос: недвижимость какое-то место хранения

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

2
ответ дан 18 December 2019 в 05:40
поделиться

Не все языки .NET имеют понятие свойств. Таким образом, интерфейсы должны также определять версии свойства get_ и set_, чтобы любой язык .NET мог использовать этот тип. Это может только усугубить ваше замешательство.

2
ответ дан 18 December 2019 в 05:40
поделиться

Ну, объявление внутри интерфейса просто сообщает вам, какие члены могут существовать в экземпляре этого интерфейса. Он ничего не говорит вам о том, как они реализованы или где они сохранены.

Я думаю, вы перепутали концепцию интерфейса с концепцией класса. Вы создаете не интерфейсы, а классы, которые их реализуют.

1
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: