Не общедоступные участники для [закрытых] интерфейсов C#

Вы можете связать несколько прослушивателей событий с элементом и использовать событие jQuery tap для сенсорных устройств.

$( ".target" ).on({
  dbclick: function() {
    //do stuff
  }, touch: function() {
    //do the same stuff
  }
});
30
задан wazz 26 July 2018 в 23:48
поделиться

7 ответов

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

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

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

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

34
ответ дан shA.t 27 November 2019 в 23:34
поделиться

Можно скрыть реализацию интерфейса путем явного утверждения имени интерфейса перед именем метода:

public interface IInterface {
    public void Method();
}

public class A : IInterface {
    public void IInterface.Method() {
        // Do something
    }
}

public class Program {
    public static void Main() {
        A o = new A();
        o.Method(); // Will not compile
        ((IInterface)o).Method(); // Will compile
    }
}
20
ответ дан Manoj Sharma 27 November 2019 в 23:34
поделиться

Не имел бы смысла. Интерфейс является контрактом с общественность , что Вы поддерживаете те методы и свойства. Палка с абстрактными классами.

5
ответ дан Ishmaeel 27 November 2019 в 23:34
поделиться

Интерфейс является контрактом, которого придерживаются все классы с реализацией. Это означает, что они должны придерживаться всего этого или ни одного из него.

, Если бы интерфейс общедоступен тогда, каждая часть того контакта должна быть общедоступной, иначе это значило бы тот для друга классы / внутренние классы и другая вещь для всего остального.

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

2
ответ дан Community 27 November 2019 в 23:34
поделиться

Можно скрыть почти весь код, реализованный интерфейсами к внешним блокам.

interface IVehicle
{
    void Drive();
    void Steer();
    void UseHook();
}
abstract class Vehicle  // :IVehicle  // Try it and see!
{
    /// <summary>
    /// Consuming classes are not required to implement this method.
    /// </summary>
    protected virtual void Hook()
    {
        return;
    }
}
class Car : Vehicle, IVehicle
{
    protected override void Hook()  // you must use keyword "override"
    {
        Console.WriteLine(" Car.Hook(): Uses abstracted method.");
    }
    #region IVehicle Members

    public void Drive()
    {
        Console.WriteLine(" Car.Drive(): Uses a tires and a motor.");
    }

    public void Steer()
    {
        Console.WriteLine(" Car.Steer(): Uses a steering wheel.");
    }
    /// <summary>
    /// This code is duplicated in implementing classes.  Hmm.
    /// </summary>
    void IVehicle.UseHook()
    {
        this.Hook();
    }

    #endregion
}
class Airplane : Vehicle, IVehicle
{
    protected override void Hook()  // you must use keyword "override"
    {
        Console.WriteLine(" Airplane.Hook(): Uses abstracted method.");
    }
    #region IVehicle Members

    public void Drive()
    {
        Console.WriteLine(" Airplane.Drive(): Uses wings and a motor.");
    }

    public void Steer()
    {
        Console.WriteLine(" Airplane.Steer(): Uses a control stick.");
    }
    /// <summary>
    /// This code is duplicated in implementing classes.  Hmm.
    /// </summary>
    void IVehicle.UseHook()
    {
        this.Hook();
    }

    #endregion
}

Это протестирует код.

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car();
        IVehicle contract = (IVehicle)car;
        UseContract(contract);  // This line is identical...
        Airplane airplane = new Airplane();
        contract = (IVehicle)airplane;
        UseContract(contract);  // ...to the line above!
    }

    private static void UseContract(IVehicle contract)
    {
        // Try typing these 3 lines yourself, watch IDE behavior.
        contract.Drive();
        contract.Steer();
        contract.UseHook();
        Console.WriteLine("Press any key to continue...");
        Console.ReadLine();
    }
}
2
ответ дан Rook 27 November 2019 в 23:34
поделиться

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

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

1
ответ дан Jon Limjap 27 November 2019 в 23:34
поделиться

Я знаком с Java, а не C#, но почему земля Вы хотели бы члена парламента, не занимающего официального поста в интерфейсе? Это не могло иметь никакой реализации и будет невидимо для классов с реализацией, быть бесполезным - также. Интерфейсы существуют для определения поведения. Если Вам нужно поведение по умолчанию, чем использование абстрактный класс.

0
ответ дан John Topley 27 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

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