Свойство C#, не доступное в производном классе

Я не уверен, что продолжается. У меня есть следующий базовый класс:

public class MyRow : IStringIndexable, System.Collections.IEnumerable,
    ICollection<KeyValuePair<string, string>>,
    IEnumerable<KeyValuePair<string, string>>,
    IDictionary<string, string>
{
    ICollection<string> IDictionary<string, string>.Keys { }
}

И затем у меня есть этот производный класс:

public class MySubRow : MyRow, IXmlSerializable, ICloneable,
    IComparable, IEquatable<MySubRow>
{
    public bool Equals(MySubRow other)
    {
        // "MyRow does not contain a definition for 'Keys'"
        foreach (string key in base.Keys) { }
    }
}

Почему я получаю ту ошибку? "'MyNamespace. MyRow' не содержит определение для 'Ключей'". Оба класса находятся в MyNamespace пространство имен. Я пытался получить доступ this.Keys и base.Keys и никакой работы из MySubRow. Я пытался отметить Keys свойство как public в MyRow но получил "Модификатор 'общественность', не допустимо для этого объекта", я думаю, потому что необходимо реализовать интерфейс.

5
задан Sarah Vessels 27 January 2010 в 16:10
поделиться

4 ответа

Вы реализуете ключевые ключи . Если вы хотите сделать этот член общедоступным (или защищенным ), изменить Идендирование <Строка, строка>. Keys - ключей и добавить соответствующую модификацию видимости в перед ним.

public ICollection<string> Keys { ... }

ИЛИ

protected ICollection<string> Keys { ... }

Вы можете ссылаться на базу в качестве экземпляра IDIctionary , а также:

((IDictionary<string, string>)base).Keys

Больше информации

(судя по вашим комментариям Похоже, что знакомы с различием, но другие не могут быть)

Реализация интерфейса C # можно сделать двумя способами: неявно или явно. Давайте рассмотрим этот интерфейс:

public interface IMyInterface
{
    void Foo();
}

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

public class MyClass : IMyInterface
{
    public void Foo() { }
}

Это удовлетворяет интерфейсу, потому что он предоставляет публику Участник в классе, который соответствует каждому участнику на интерфейсе. Это то, что обычно делается. Тем не менее, можно явно внедрить интерфейс и отобразить функцию интерфейса к личному частным :

public class MyClass : IMyInterface
{
    void IMyInterface.Foo() { }
}

Это создает частную функцию на MyClass , который Доступны только для внешних абонентов, когда они ссылаются на экземпляр ImyInterface . Например:

void Bar()
{
    MyClass class1 = new MyClass();
    IMyInterface class2 = new MyClass();

    class1.Foo(); // works only in the first implementation style
    class2.Foo(); // works for both
}

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

9
ответ дан 13 December 2019 в 05:35
поделиться

Так как вы реализуете Идентируют Интерфейс явно, вы сначала должны бросить это , чтобы - IdictionAry :

public bool Equals(MySubRow other)
{
    foreach (string key in ((IDictionary<string,string>)this).Keys) { }
}
3
ответ дан 13 December 2019 в 05:35
поделиться

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

public class MyRow : IStringIndexable, System.Collections.IEnumerable,
    ICollection<KeyValuePair<string, string>>,
    IEnumerable<KeyValuePair<string, string>>,
    IDictionary<string, string>
{
    ICollection<string> Keys { }
}
0
ответ дан 13 December 2019 в 05:35
поделиться

защищены позволит наследовать классы, чтобы его увидеть, но нет другого класса

0
ответ дан 13 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

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