Здравствуйте, Darooma, Вы писали:
D>Тогда его не получится вызвать, потому что у MyPage есть множество объектов.
Единственный раз, когда мне нужны были виртуальные статические методы — это когда я хотел виртуальные операторы, потому что они бывают только static. Во всех остальных случаях, мне кажется, они бессмысленны.
Если бы вы попробовали абстрагироваться от ASP.NET и описать проблему в терминах "класс A, класс B, метод Foo" и так далее, может будет понятнее, зачем вам такая странная вещь как виртуальные статические функции.
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, Darooma, Вы писали:
D>>Тогда его не получится вызвать, потому что у MyPage есть множество объектов.
C>Единственный раз, когда мне нужны были виртуальные статические методы — это когда я хотел виртуальные операторы, потому что они бывают только static. Во всех остальных случаях, мне кажется, они бессмысленны.
C>Если бы вы попробовали абстрагироваться от ASP.NET и описать проблему в терминах "класс A, класс B, метод Foo" и так далее, может будет понятнее, зачем вам такая странная вещь как виртуальные статические функции.
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, Darooma, Вы писали:
D>>foo — Это метод в другом классе, не в странице-классе MyPage.
C>А каким тогда образом Foo должен знать, какой именно метод MyPage вызывать? Если есть this, то по нему можно узнать, какой именно метод вызывается.
public partial class MyPage : System.Web.UI.Page {
protected void Page_Init(object sender, EventArgs e) { }
public static string PageUrl { get{ return"/Secure/App/MyPage.aspx";} }
}
public partial class MyPage2 : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
if (good)
Response.Redirect(MyPage.GetPageUrl);
}
}
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, Darooma, Вы писали:
D>>Почитайте сообщения выше.
C>Почитал. Все равно не понимаю Пойду попью кофе.
В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ). Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику.
, там C#, но на Nemerle точно также. И там только переопределение и расширение функциональности, через базовый класс не обратиться всё равно, т.е. такой метод защищает от ошибок переопределения, но не эмулирует virtual/override.
Чтобы стало понятнее почему их нет — представь следующую ситуацию: одна базовая страница и три наследника с гипотетическим "static override". Ты вызываешь BasePage.GetPageUrl, теперь компилятору нужно понять, какого именно наследника сделавшего override вызвать. Ну и как? Если же ты хочешь вызвать именно Derived1.GetPageUrl, то это уже не override, т.к. тип ты указал, а обычный static new. И если надо заиспользовать функциональность BasePage, то просто вызови из него BasePage.GetPageUrl если надо.
Обычно всю логику переходов по страницам выносят или в SiteMap (сделав свою реализацию) или в отдельный класс отвечающий за редиректы. Где и как хранить или создавать экземпляры этого класса зависит уже от того откуда ты делаешь редиректы. Если же надо не просто переходы, а что-то более сложное — то тут уже надо разбирать детально что именно. Может хватить просто по каким-то критериям определять какую именно страницу вызывать, и тогда хватает тех static что есть. А может лучше свой HTTP handler писать, и всю логику в него, в том числе и логику разных реализаций GetPageUrl.
Здравствуйте, Darooma, Вы писали:
D>В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ). Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику. D>
Не мог бы ты привести пример, я нисколечко не понимаю, как можно использовать виртуальный статик метод. Я не понимаю, что значит "добавлена некая логика", никакое наследование не позволяет добавить логику, максимум — вызвать базовый метод. Но вызвать базовый статик метод никакой проблемы не составляет, виртуальный он или нет.
Здравствуйте, hi_octane, Вы писали:
_>Чтобы стало понятнее почему их нет — представь следующую ситуацию: одна базовая страница и три наследника с гипотетическим "static override". Ты вызываешь BasePage.GetPageUrl, теперь компилятору нужно понять, какого именно наследника сделавшего override вызвать. Ну и как? Если же ты хочешь вызвать именно Derived1.GetPageUrl, то это уже не override, т.к. тип ты указал, а обычный static new. И если надо заиспользовать функциональность BasePage, то просто вызови из него BasePage.GetPageUrl если надо.
В C++ есть виртуальные статические функции. Как же он это делает?
Я позже создам новую тему и опишу там, что нужно сделать.