Здравствуйте, 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");
}
}
Компилятор, то может определить, у какого класса вызывается статический метод.
Здравствуйте, Darooma, Вы писали:
D>В C++ есть виртуальные статические функции. Как же он это делает?
Это не так. Единственный язык (из известных мне) где есть подобное — это Дельфи. Но и там это всего лишь реализация паттерна "синглтон", так что он не будет вести себя так как хочешь ты.
Описанное тобой поведение вообще не возможно, на мой взгляд.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, 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
}
}
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Darooma, Вы писали:
D>>В C++ есть виртуальные статические функции. Как же он это делает? WH>В С++ их нет.
Здравствуйте, Аноним, Вы писали:
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
}
}
Здравствуйте, Аноним, Вы писали:
А>Вот условный пседокод, на 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>Это и так определяется. Ты видимо не верно понимаешь виртуальность методов.
Вы видимо не понимаете, что перед тем как отвечать, имеет смысл посмотреть не ушла ли дискуссия дальше.