Я не уверен, что продолжается. У меня есть следующий базовый класс:
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
но получил "Модификатор 'общественность', не допустимо для этого объекта", я думаю, потому что необходимо реализовать интерфейс.
Вы реализуете ключевые ключи
. Если вы хотите сделать этот член общедоступным (или защищенным
), изменить Идендирование <Строка, строка>. 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, или если два интерфейса выставляют участников с тем же именем.
Так как вы реализуете Идентируют это
, чтобы -
IdictionAry
:
public bool Equals(MySubRow other)
{
foreach (string key in ((IDictionary<string,string>)this).Keys) { }
}
Я верю, как Джаред, так и Адам верны: свойство - это разъяснение, реализуемая на базовом классе, что приведет к нему общественности. Вы должны быть в состоянии изменить его в неявную реализацию и сделать его счастливым:
public class MyRow : IStringIndexable, System.Collections.IEnumerable,
ICollection<KeyValuePair<string, string>>,
IEnumerable<KeyValuePair<string, string>>,
IDictionary<string, string>
{
ICollection<string> Keys { }
}
защищены
позволит наследовать классы, чтобы его увидеть, но нет другого класса