Re[13]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 08:28
Оценка:
Здравствуйте, catbert, Вы писали:

C>Может я не понимаю чего-то, но почему не так?


C>
C>void Foo(){
C>if (good)
C>    Response.Redirect(this.PageUrl);
C>}
C>

foo — Это метод в другом классе, не в странице-классе MyPage.
Re[12]: Помогите перевести с C#
От: catbert  
Дата: 30.05.11 08:32
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Тогда его не получится вызвать, потому что у MyPage есть множество объектов.


Единственный раз, когда мне нужны были виртуальные статические методы — это когда я хотел виртуальные операторы, потому что они бывают только static. Во всех остальных случаях, мне кажется, они бессмысленны.

Если бы вы попробовали абстрагироваться от ASP.NET и описать проблему в терминах "класс A, класс B, метод Foo" и так далее, может будет понятнее, зачем вам такая странная вещь как виртуальные статические функции.
Re[13]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 08:33
Оценка:
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);
}
}
Без статического метода никак.
Re[13]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 08:34
Оценка:
Здравствуйте, catbert, Вы писали:

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


D>>Тогда его не получится вызвать, потому что у MyPage есть множество объектов.


C>Единственный раз, когда мне нужны были виртуальные статические методы — это когда я хотел виртуальные операторы, потому что они бывают только static. Во всех остальных случаях, мне кажется, они бессмысленны.


C>Если бы вы попробовали абстрагироваться от ASP.NET и описать проблему в терминах "класс A, класс B, метод Foo" и так далее, может будет понятнее, зачем вам такая странная вещь как виртуальные статические функции.


Покажите на примере. Я не знаю как.
Re[14]: Помогите перевести с C#
От: catbert  
Дата: 30.05.11 08:35
Оценка:
Здравствуйте, Darooma, Вы писали:

D>foo — Это метод в другом классе, не в странице-классе MyPage.


А каким тогда образом Foo должен знать, какой именно метод MyPage вызывать? Если есть this, то по нему можно узнать, какой именно метод вызывается.
Re[15]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 08:37
Оценка:
Здравствуйте, 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);
   }
 }

Без статического метода никак.
Re[16]: Помогите перевести с C#
От: catbert  
Дата: 30.05.11 08:40
Оценка:
Здравствуйте, Darooma, Вы писали:

D>

D>public partial class MyPage : System.Web.UI.Page {
D> protected void Page_Init(object sender, EventArgs e) { }
D> public static string PageUrl { get{ return "/Secure/App/MyPage.aspx";} }
D> }



D> public partial class MyPage2 : System.Web.UI.Page {
D> protected void Page_Load(object sender, EventArgs e) {
D>   if (good)
D>      Response.Redirect(MyPage.GetPageUrl);
D>   }
D> }
 
D>


Хм.. все равно не понимаю... зачем тут виртуальность?
Re[17]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 08:41
Оценка:
Здравствуйте, catbert, Вы писали:

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


D>>

D>>public partial class MyPage : System.Web.UI.Page {
D>> protected void Page_Init(object sender, EventArgs e) { }
D>> public static string PageUrl { get{ return "/Secure/App/MyPage.aspx";} }
D>> }



D>> public partial class MyPage2 : System.Web.UI.Page {
D>> protected void Page_Load(object sender, EventArgs e) {
D>>   if (good)
D>>      Response.Redirect(MyPage.GetPageUrl);
D>>   }
D>> }
 
D>>


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

Почитайте сообщения выше.
Re[18]: Помогите перевести с C#
От: catbert  
Дата: 30.05.11 08:51
Оценка:
Здравствуйте, Darooma, Вы писали:

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


Почитал. Все равно не понимаю Пойду попью кофе.
Re[19]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 09:00
Оценка:
Здравствуйте, catbert, Вы писали:

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


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


C>Почитал. Все равно не понимаю Пойду попью кофе.



В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ). Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику.
Re[10]: Помогите перевести с C#
От: hardcase Пират http://nemerle.org
Дата: 30.05.11 10:26
Оценка:
Здравствуйте, Darooma, Вы писали:

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



VD>>И вообще что-то ты очень сильно мудришь.



D>
D> public partial class MyPage : System.Web.UI.Page {
D>        protected void Page_Init(object sender, EventArgs e) { }
D>        public static string PageUrl { get{ return "/Secure/App/MyPage.aspx";} }
D>}

D>//.....................................
D>void Foo(){
D>if (good)
D> Response.Redirect(MyPage.GetPageUrl);
D>}
D>

D>Как по-другому я не знаю. Response.Redirect("/Secure/App/MyPage.aspx") не подходит.

А зачем вообще конфигурациюнные параметры сваливать в Page?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[11]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 10:33
Оценка:
Здравствуйте, hardcase, Вы писали:

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


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



VD>>>И вообще что-то ты очень сильно мудришь.



D>>
D>> public partial class MyPage : System.Web.UI.Page {
D>>        protected void Page_Init(object sender, EventArgs e) { }
D>>        public static string PageUrl { get{ return "/Secure/App/MyPage.aspx";} }
D>>}

D>>//.....................................
D>>void Foo(){
D>>if (good)
D>> Response.Redirect(MyPage.GetPageUrl);
D>>}
D>>

D>>Как по-другому я не знаю. Response.Redirect("/Secure/App/MyPage.aspx") не подходит.

H>А зачем вообще конфигурациюнные параметры сваливать в Page?


Я совсем не понимаю ни ваших комментариев, ни вопросов.
Re[12]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 30.05.11 20:42
Оценка: 8 (1)
D>Я совсем не понимаю ни ваших комментариев, ни вопросов.
В .NET нету виртуальных статических методов, и соответственно их нету ни в C# ни в Nemerle.

Правда один вариант на Generics я как-то приводил вот тут, советую также почитать всё обсуждение
Автор: hi_octane
Дата: 14.02.08
, там C#, но на Nemerle точно также. И там только переопределение и расширение функциональности, через базовый класс не обратиться всё равно, т.е. такой метод защищает от ошибок переопределения, но не эмулирует virtual/override.

Чтобы стало понятнее почему их нет — представь следующую ситуацию: одна базовая страница и три наследника с гипотетическим "static override". Ты вызываешь BasePage.GetPageUrl, теперь компилятору нужно понять, какого именно наследника сделавшего override вызвать. Ну и как? Если же ты хочешь вызвать именно Derived1.GetPageUrl, то это уже не override, т.к. тип ты указал, а обычный static new. И если надо заиспользовать функциональность BasePage, то просто вызови из него BasePage.GetPageUrl если надо.

Обычно всю логику переходов по страницам выносят или в SiteMap (сделав свою реализацию) или в отдельный класс отвечающий за редиректы. Где и как хранить или создавать экземпляры этого класса зависит уже от того откуда ты делаешь редиректы. Если же надо не просто переходы, а что-то более сложное — то тут уже надо разбирать детально что именно. Может хватить просто по каким-то критериям определять какую именно страницу вызывать, и тогда хватает тех static что есть. А может лучше свой HTTP handler писать, и всю логику в него, в том числе и логику разных реализаций GetPageUrl.
Re[3]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.05.11 21:25
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Пока что yield не работает в локальных функциях.


Информация устарела, так как теперь есть ComputationExpressions.

К сожалению документацию к ним еще никто не написал. Так что единственный материал что есть это этот блог.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Помогите перевести с C#
От: Ziaw Россия  
Дата: 31.05.11 01:57
Оценка:
Здравствуйте, Darooma, Вы писали:

D>В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ). Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику.

D>


Не мог бы ты привести пример, я нисколечко не понимаю, как можно использовать виртуальный статик метод. Я не понимаю, что значит "добавлена некая логика", никакое наследование не позволяет добавить логику, максимум — вызвать базовый метод. Но вызвать базовый статик метод никакой проблемы не составляет, виртуальный он или нет.
Re[13]: Помогите перевести с C#
От: Darooma Россия  
Дата: 31.05.11 05:45
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Чтобы стало понятнее почему их нет — представь следующую ситуацию: одна базовая страница и три наследника с гипотетическим "static override". Ты вызываешь BasePage.GetPageUrl, теперь компилятору нужно понять, какого именно наследника сделавшего override вызвать. Ну и как? Если же ты хочешь вызвать именно Derived1.GetPageUrl, то это уже не override, т.к. тип ты указал, а обычный static new. И если надо заиспользовать функциональность BasePage, то просто вызови из него BasePage.GetPageUrl если надо.


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

Я позже создам новую тему и опишу там, что нужно сделать.
Re[14]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 31.05.11 07:12
Оценка:
D>В C++ есть виртуальные статические функции. Как же он это делает?

Можно пример или ссылку на стандарт? А то гугл говорит что нету...
Re[14]: Помогите перевести с C#
От: WolfHound  
Дата: 31.05.11 07:56
Оценка: +1
Здравствуйте, Darooma, Вы писали:

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

В С++ их нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[14]: Помогите перевести с C#
От: catbert  
Дата: 31.05.11 08:09
Оценка:
Здравствуйте, Darooma, Вы писали:

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


В C++ нету виртуальных статических функций. Как и в Джаве, C#, и других подобных языках программирования.
Re[14]: Помогите перевести с C#
От: Ziaw Россия  
Дата: 31.05.11 12:37
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Без статического метода никак.


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