Re[18]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.11 15:26
Оценка:
Здравствуйте, Darooma, Вы писали:

C>>Хм.. все равно не понимаю... зачем тут виртуальность?

D>Почитайте сообщения выше.

Тут как не читай вывод получается один — косяк дизайна. Требования взаимоисключающие.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.11 15:33
Оценка:
Здравствуйте, Darooma, Вы писали:

D>[i]В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ).


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

D>Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика.


Это слишком абстрактно. Давай, лучше, ты опишешь саму задачу, а не то решение которое ты для нее придумал. А потом вместе подумаем.

D>Поэтому его нужно сделать виртуальным.


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

D>Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new.


У тебя первое требование уже противоречит второму. Дальше уже можно не ходить. Ты очень странно понимаешь виртуальность методов. Статические методы и виртуальные методы не совместимы иделогически.

Есть языки (например, Delphi) в которых есть нечто похожее на виртуальные статические методы, но на самом деле это ни что иное как встраивание в язык паттерна "синглтон". Там под капотом создается объект имеющий один экземпляр и уже у него заводятся виртуальные методы. Используется это в основном как фабрика классов (опять же ОО-паттерн).

Ты же хочешь чего-то странного. Твои требования просто невозможно удовлетворить одновременно (ни на одном из существующих языков).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: Помогите перевести с C#
От: Аноним  
Дата: 31.05.11 16:58
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Твои требования просто невозможно удовлетворить одновременно (ни на одном из существующих языков).

Вот условный пседокод, на C#.
public class A {
  public virtual static void C() { Console.WriteLine("A"); }
}

public class B : A {
  public override static void C() { Console.WriteLine("B"); base(); }
}

class Program {
  public static void Main(string[] arguments) {
    A.C(); // Console.WriteLine("A")
    B.C(); // Console.WriteLine("B"); Console.WriteLine("A");
  }
}

Компилятор, то может определить, у какого класса вызывается статический метод.
Re[14]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.11 16:58
Оценка:
Здравствуйте, Darooma, Вы писали:

D>В C++ есть виртуальные статические функции. Как же он это делает?


Это не так. Единственный язык (из известных мне) где есть подобное — это Дельфи. Но и там это всего лишь реализация паттерна "синглтон", так что он не будет вести себя так как хочешь ты.

Описанное тобой поведение вообще не возможно, на мой взгляд.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: Помогите перевести с C#
От: Ziaw Россия  
Дата: 31.05.11 17:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот условный пседокод, на C#.


А>
А>public class A {
А>  public virtual static void C() { Console.WriteLine("A"); }
А>}

А>public class B : A {
А>  public override static void C() { Console.WriteLine("B"); base(); }
А>}

А>class Program {
А>  public static void Main(string[] arguments) {
А>    A.C(); // Console.WriteLine("A")
А>    B.C(); // Console.WriteLine("B"); Console.WriteLine("A");
А>  }
А>}
А>

А>Компилятор, то может определить, у какого класса вызывается статический метод.

Вся затея ради base()? Что мешает вместо него написать A.C()?
Re[13]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.11 17:34
Оценка:
Здравствуйте, hi_octane, Вы писали:

D>>Я совсем не понимаю ни ваших комментариев, ни вопросов.

_>В .NET нету виртуальных статических методов, и соответственно их нету ни в C# ни в Nemerle.

Между утверждениями "В .NET нету виртуальных статических методов" и "их нету ни в C# ни в Nemerle" нет никакой связи. Например, в Delphi .Net они таки есть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Помогите перевести с C#
От: Аноним  
Дата: 31.05.11 17:44
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Вся затея ради base()? Что мешает вместо него написать A.C()?

В этом примере — да. Вот другой пример посложнее

class A {
  protected static void C1() { C2(); }
  protected virtual static void C2() { Console.WriteLine("A.C2"); }
}

class B : A {
  protected override static void C2() { Console.WriteLine("B.C2"); }
}

class Program {
  public static void Main(string[] arguments) {
    B.C1(); // B:C2
  }
}
Re[15]: Помогите перевести с C#
От: Darooma Россия  
Дата: 31.05.11 18:42
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Darooma, Вы писали:


D>>В C++ есть виртуальные статические функции. Как же он это делает?

WH>В С++ их нет.

И вправду нет.
Re[24]: Помогите перевести с C#
От: Ziaw Россия  
Дата: 01.06.11 02:23
Оценка:
Здравствуйте, Аноним, Вы писали:

Z>>Вся затея ради base()? Что мешает вместо него написать A.C()?

А>В этом примере — да. Вот другой пример посложнее.

Мысль понятна, обычно это делается через обычные функции и синглтон.

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

Но! Как раз потому, что компайлайма вполне достаточно — это можно решить макросом.

module A {
  public C1() : void    { C2(); }
  protected C2() : void { Console.WriteLine("A.C2"); }
}

[OverrideStatic] // просто копирует все методы
module B : A {
  // сгенерированный макросом метод
  public C1() : void    { C2(); }

  protected C2() : void { Console.WriteLine("B.C2"); }
}

class Program {
  public static void Main(string[] arguments) {
    B.C1(); // B:C2
  }
}
Re[22]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.11 14:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот условный пседокод, на C#.

А>
А>public class A {
А>  public virtual static void C() { Console.WriteLine("A"); }
А>}

А>public class B : A {
А>  public override static void C() { Console.WriteLine("B"); base(); }
А>}

А>class Program {
А>  public static void Main(string[] arguments) {
А>    A.C(); // Console.WriteLine("A")
А>    B.C(); // Console.WriteLine("B"); Console.WriteLine("A");
А>  }
А>}
А>


Это полная бессмыслица. Точно такой же код будет без override. Только замени base() на A.C(). И наследование тут не нужно.

А>Компилятор, то может определить, у какого класса вызывается статический метод.


Это и так определяется. Ты видимо не верно понимаешь виртуальность методов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Помогите перевести с C#
От: Аноним  
Дата: 01.06.11 14:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это полная бессмыслица. Точно такой же код будет без override. Только замени base() на A.C(). И наследование тут не нужно.

Видимо вы не поняли, что смысл данного псевдокода как раз в base.

VD>Это и так определяется. Ты видимо не верно понимаешь виртуальность методов.

Вы видимо не понимаете, что перед тем как отвечать, имеет смысл посмотреть не ушла ли дискуссия дальше.
Re[24]: Помогите перевести с C#
От: hardcase Пират http://nemerle.org
Дата: 01.06.11 15:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В этом примере — да. Вот другой пример посложнее


Этот пример называется "здравствуй багодром". Вот именно поэтому и нет виртуальных статиков.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[24]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.11 15:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Видимо вы не поняли, что смысл данного псевдокода как раз в base.


Я понял. Это называется требовать "шашечки" вместо ехать. Никаких реальных проблем это не решает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.