Nano Hash - криптовалюты, майнинг, программирование

Как реализовать методы по умолчанию для интерфейса?

При создании нового класса в .Net, если я объявляю его «Реализует IDisposable» и нажимаю Enter, я вижу, что Visual Studio самостоятельно добавляет различные методы и функции, уже заполненные к моему классу. Когда я пытаюсь сделать это с помощью своих интерфейсов, он создает пустые методы и функции.

Есть ли способ предоставить реализации моих методов и функций по умолчанию?

Я искал ссылку но это не решило мою проблему.

Пример реализации, который я ищу:

#Region "IDisposable Support"
    Private disposedValue As Boolean ' To detect redundant calls

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: dispose managed state (managed objects).
            End If

            ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
            ' TODO: set large fields to null.
        End If
        Me.disposedValue = True
    End Sub

    ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
    'Protected Overrides Sub Finalize()
    '    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
    '    Dispose(False)
    '    MyBase.Finalize()
    'End Sub

    ' This code added by Visual Basic to correctly implement the disposable pattern.
    Public Sub Dispose() Implements IDisposable.Dispose
        ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

Приветствую заранее.

Дальнейшие объяснения того, что я ищу:

Предположим, следующий интерфейс

введите описание изображения здесь

Вот что происходит и что я ищу:

введите описание изображения здесь


  • msdn.microsoft.com/es-es/library/87d83y5b.aspx Интерфейс не может реализовать функции. Он определяет только некоторые функции, которые классы, реализующие интерфейс, должны будут реализовать. Возможно, вы захотите проверить абстрактный класс. msdn.microsoft.com/en-us/ библиотека / k535acbf% 28v = vs.71% 29.aspx 11.10.2014
  • Спасибо за Ваш ответ. Но как работают интерфейсы .Net? Почему они автоматически добавляют весь этот код в мой класс, когда я пытаюсь реализовать один из них. Я ищу именно эту функцию. 11.10.2014
  • Не совсем понятно, о чем вы спрашиваете. 11.10.2014
  • Он знает, как настроить базовую IDisposable реализацию, поскольку есть общий шаблон, которому вы должны следовать. Как он мог знать о том, как реализовать ваши интерфейсы? 11.10.2014
  • Это именно то, что я ищу для обладателя гранта! 11.10.2014
  • Это жестко встроено в IDE VB.NET для IDisposable, это не расширяемая схема. Единственный другой способ автоматически сгенерировать код - использовать сниппеты. 11.10.2014
  • Спасибо за ваше предложение. Вы знаете, как связать интерфейс с сниппетом, чтобы он вставлялся автоматически, когда пользователь пытается реализовать интерфейс? 11.10.2014
  • Я добавил изображение того, что ищу 11.10.2014
  • Вы рассматривали абстрактный класс? Не то же самое и только комментарий. 11.10.2014

Ответы:


1

Это старый вопрос, но сюда могут прийти и другие, у которых есть такие же вопросы.

Вышеуказанные ответы устарели.

Начиная с C # 8, у вас может быть интерфейс по умолчанию методы.

Безопасное обновление интерфейсов с использованием методов интерфейса по умолчанию в C # статья в документации очень хорошо объясняет вещи.

Ниже приведен пример из документации.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace customer_relationship
{
    public interface ICustomer
    {
        IEnumerable<IOrder> PreviousOrders { get; }

        DateTime DateJoined { get; }
        DateTime? LastOrder { get; }
        string Name { get; }
        IDictionary<DateTime, string> Reminders { get; }

        public static void SetLoyaltyThresholds(TimeSpan ago, int minimumOrders, decimal percentageDiscount) // See how a method has a default implementation.
        {
            length = ago;
            orderCount = minimumOrders;
            discountPercent = percentageDiscount;
        }
        private static TimeSpan length = new TimeSpan(365 * 2, 0, 0, 0); // two years
        private static int orderCount = 10;
        private static decimal discountPercent = 0.10m;

        public decimal ComputeLoyaltyDiscount() => DefaultLoyaltyDiscount(this);
        protected static decimal DefaultLoyaltyDiscount(ICustomer c)
        {
            DateTime start = DateTime.Now - length;

            if ((c.DateJoined < start) && (c.PreviousOrders.Count() > orderCount))
            {
                return discountPercent;
            }
            return 0;
        }
    }
}
05.01.2020

2

Он знает, как настроить базовую IDisposable реализацию, поскольку есть общий шаблон, которому вы должны следовать.

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

Лучше всего настроить сниппет и вставить его, а не разрешать Visual Studio добавляет нереализованных участников.

11.10.2014
  • Сделаем это просто. Когда вы реализуете интерфейс IDisposable, добавляются не только пустые методы, но и их коды, которые наверняка были откуда-то извлечены ... Посмотрите на пример, который я показал в моем первом посте. Вопрос в том, как сделать то же самое с моими собственными интерфейсами ... Предполагая, что у меня есть код, который должен быть реализацией метода интерфейса по умолчанию, когда я реализую интерфейс в классе, код добавляется автоматически ... 11.10.2014
  • Я добавил еще одну идею. 11.10.2014
  • Спасибо за ваше предложение. Вы знаете, как связать интерфейс с сниппетом, чтобы он вставлялся автоматически, когда пользователь пытается реализовать интерфейс? 11.10.2014
  • Я не знаю никакого способа, нет. 11.10.2014

  • 3

    Самое важное, что я могу придумать, - это создать свой собственный шаблон элемента, который можно выбрать в диалоговом окне «Добавить новый элемент» визуальной студии. Вы можете изменить шаблон рефакторинга, но это изменит все реализации интерфейса. Создание шаблонов элементов обсуждается здесь: http://msdn.microsoft.com/en-us/library/tsyyf0yh.aspx

    11.10.2014
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..