Студопедия — Partial 9 страница
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Partial 9 страница






Пример.

public class List
{
// Private data structure
private class Node
{
public object Data;
public Node Next;

public Node(object data, Node next) {
this.Data = data;
this.Next = next;
}
}

private Node first = null;
private Node last = null;

// Public interface

public void AddToFront(object o) {...}

public void AddToBack(object o) {...}

public object RemoveFromFront() {...}

public object RemoveFromBack() {...}

public int Count { get {...} }
}

В этом примере объявляется частный вложенный класс Node.

10.3.8.3 Скрытие;

Вложенный тип может скрывать (§3.7.1) базовый член. В объявлениях вложенных типов разрешен модификатор new, так что скрытие можно выразить явно. Пример.

using System;

class Base
{
public static void M() {
Console.WriteLine("Base.M");
}
}

class Derived: Base
{
new public class M
{
public static void F() {
Console.WriteLine("Derived.M.F");
}
}
}

class Test
{
static void Main() {
Derived.M.F();
}
}

показан вложенный класс M, скрывающий метод M, определенный в Base.

This

Вложенный тип и его тип-контейнер не имеют особого отношения к доступу_this (§7.6.7). В частности, this внутри вложенного типа нельзя использовать для ссылки на члены экземпляра типа-контейнера. В случае, если вложенному типу требуется доступ к членам экземпляра типа-контейнера, доступ может быть выполнен предоставлением this для экземпляра типа-контейнера в качестве аргумента конструктора для вложенного типа. Пример.

using System;

class C
{
int i = 123;

public void F() {
Nested n = new Nested(this);
n.G();
}

public class Nested
{
C this_c;

public Nested(C c) {
this_c = c;
}

public void G() {
Console.WriteLine(this_c.i);
}
}
}

class Test
{
static void Main() {
C c = new C();
c.F();
}
}

В этом примере показан этот способ. Экземпляр C создает экземпляр Nested и передает свой собственный this конструктору Nested, чтобы предоставить последовательный доступ к членам экземпляра C.

10.3.8.5 Доступ к частным и защищенным членам типа-контейнера

Вложенный тип имеет доступ ко всем членам, к которым есть доступ из типа-контейнера, в том числе к членам типа-контейнера с объявленной доступностью private и protected. Пример.

using System;

class C
{
private static void F() {
Console.WriteLine("C.F");
}

public class Nested
{
public static void G() {
F();
}
}
}

class Test
{
static void Main() {
C.Nested.G();
}
}

показан класс C, содержащий вложенный класс Nested. Внутри Nested метод G вызывает статический метод F, определенный в C, а F имеет частную объявленную доступность.

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

using System;

class Base
{
protected void F() {
Console.WriteLine("Base.F");
}
}

class Derived: Base
{
public class Nested
{
public void G() {
Derived d = new Derived();
d.F(); // ok
}
}
}

class Test
{
static void Main() {
Derived.Nested n = new Derived.Nested();
n.G();
}
}

вложенный класс Derived.Nested обращается к защищенному методу F, определенному в Base, базовом классе класса Derived, вызовом через экземпляр класса Derived.

10.3.8.6 Вложенные типы в универсальных классах

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

Каждое объявление типа, содержащееся внутри объявления универсального типа, неявно является объявлением универсального типа. При записи обращения к типу, вложенному в универсальный тип, сформированный тип-контейнер, включая его аргументы типа, должен быть именован. Однако изнутри внешнего класса вложенный тип можно использовать без уточнения; тип экземпляра внешнего класса может быть неявно использован при формировании вложенного типа. В следующем примере показаны три разных правильных способа обращения к сформированному типу, созданному из Inner; первые два способа эквивалентны.

class Outer<T>
{
class Inner<U>
{
public static void F(T t, U u) {...}
}

static void F(T t) {
Outer<T>.Inner<string>.F(t, "abc"); // These two statements have
Inner<string>.F(t, "abc"); // the same effect

Outer<int>.Inner<string>.F(3, "abc"); // This type is different

Outer.Inner<string>.F(t, "abc"); // Error, Outer needs type arg
}
}

Хотя это плохой стиль программирования, параметр типа во вложенном типе может скрывать член или параметр типа, объявленный во внешнем типе:

class Outer<T>
{
class Inner<T> // Valid, hides Outer’s T
{
public T t; // Refers to Inner’s T
}
}

10.3.9 Зарезервированные имена членов

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

Зарезервированные имена не вводят объявления, и таким образом не участвуют в поиске членов. Но подписи зарезервированного метода, связанные с объявлением, все же участвуют в наследовании (§10.3.3) и могут быть скрыты с помощью модификатора new (§10.3.4).

Резервирование этих имен служит трем целям:

· разрешить базовой реализации использовать обычный идентификатор в качестве имени метода для получения или установки доступа к средствам языка C#;

· разрешить другим языкам возможность взаимодействия, используя обычный идентификатор в качестве имени метода для получения или установки доступа к средствам языка C#;

· обеспечение того, чтобы исходный код, принятый одним соответствующим компилятором, был принят и другим, сделав особенности зарезервированных имен членов согласованными по всем реализациям C#.

Объявление деструктора (§10.13) также вызывает резервирование подписи (§10.3.9.4).

10.3.9.1 Имена членов, зарезервированные для свойств

Для свойства P (§10.7) типа T зарезервированы следующие подписи:

T get_P();
void set_P(T value);

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

Пример.

using System;

class A
{
public int P {
get { return 123; }
}
}

class B: A
{
new public int get_P() {
return 456;
}

new public void set_P(int value) {
}
}

class Test
{
static void Main() {
B b = new B();
A a = b;
Console.WriteLine(a.P);
Console.WriteLine(b.P);
Console.WriteLine(b.get_P());
}
}

класс A определяет свойство P только для чтения, резервируя тем самым подписи для методов get_P и set_P. Класс B является производным от A, и скрывает обе эти зарезервированные сигнатуры. Далее показан вывод для вышеуказанного примера.

123
123
456

10.3.9.2 Имена членов, зарезервированные для событий

Для события E (§10.8) типа делегата T зарезервированы следующие подписи:







Дата добавления: 2015-09-07; просмотров: 419. Нарушение авторских прав; Мы поможем в написании вашей работы!



Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вопрос 1. Коллективные средства защиты: вентиляция, освещение, защита от шума и вибрации Коллективные средства защиты: вентиляция, освещение, защита от шума и вибрации К коллективным средствам защиты относятся: вентиляция, отопление, освещение, защита от шума и вибрации...

Задержки и неисправности пистолета Макарова 1.Что может произойти при стрельбе из пистолета, если загрязнятся пазы на рамке...

Вопрос. Отличие деятельности человека от поведения животных главные отличия деятельности человека от активности животных сводятся к следующему: 1...

Тема: Кинематика поступательного и вращательного движения. 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью, проекция которой изменяется со временем 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью...

Условия приобретения статуса индивидуального предпринимателя. В соответствии с п. 1 ст. 23 ГК РФ гражданин вправе заниматься предпринимательской деятельностью без образования юридического лица с момента государственной регистрации в качестве индивидуального предпринимателя. Каковы же условия такой регистрации и...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

Studopedia.info - Студопедия - 2014-2024 год . (0.013 сек.) русская версия | украинская версия