Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];

Вниз

Виртуальные статические методы   Найти похожие ветки 

 
XentaAbsenta ©   (2008-12-19 05:20) [0]

Блин, как же их мне не хватает в C#. Надоело фабрики писать....
Кстати, что там о других языках известно?


 
wl ©   (2008-12-19 16:11) [1]

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


 
Юрий Зотов ©   (2008-12-19 16:18) [2]

Похоже, имелись в виду виртуальные классовые методы (в терминах Delphi).


 
Ins ©   (2008-12-19 17:17) [3]


> как его можно сделать виртуальным?


Ну, бывает же "старый новый год", так почему не быть "виртуальному статическому методу" ;-)

А вообще, понятно что имел в виду автор, но путать классовый метод в Delphi со статическим методом в C# не стоит, это немного разные понятия. Классовый метод в Delphi - это именно метод, т.е. в него неявно передается ссылка на данные, для которых код выполняется, разница в том, что эти данные - ссылка на сам класс, а не его экземпляр. А статические методы в C# - это по сути не методы, а просто процедуры/функции, занесенные в пространство имен класса.


 
oxffff ©   (2008-12-19 20:00) [4]


> Ins ©   (19.12.08 17:17) [3]


Справка по delphi 7.

Method bindings can be static (the default), virtual, or dynamic. Virtual and dynamic methods can be overridden, and they can be abstract. These designations come into play when a variable of one class type holds a value of a descendant class type. They determine which implementation is activated when a method is called.

Methods are by default static. When a static method is called, the declared (compile-time) type of the class or object variable used in the method call determines which implementation to activate. In the following example, the Draw methods are static.

type
 TFigure = class
   procedure Draw;
 end;
 TRectangle = class(TFigure)
   procedure Draw;
 end;


 
Sergey Masloff   (2008-12-19 20:48) [5]

oxffff ©   (19.12.08 20:00) [4]
Тут имеются в виду static в сишной терминологии


 
oxffff ©   (2008-12-19 23:30) [6]


> Sergey Masloff   (19.12.08 20:48) [5]


Сложность в том, что в Delphi еще есть

Class Static Methods
Like class methods, class static methods can be accessed without an object reference. Unlike ordinary class methods, class static methods have no Self parameter at all. They also cannot access any instance members. (They still have access to class fields, class properties, and class methods.) Also unlike class methods, class static methods cannot be declared virtual.  

Methods are made class static by appending the word static to their declaration, for example

type
  TMyClass = class
    strict private
      class var
      FX: Integer;
       
    strict protected
   
      // Note: accessors for class properties must be declared class static.
      class function GetX: Integer; static;
      class procedure SetX(val: Integer); static;


 
Ins ©   (2008-12-20 10:52) [7]


> oxffff ©   (19.12.08 20:00) [4]


Свежая информация! ;-) Только я не понял, на что обратить внимание


 
oxffff ©   (2008-12-20 11:58) [8]


> Ins ©   (20.12.08 10:52) [7]


Рекомендую обращать внимание на все и сразу. ;)


 
oxffff ©   (2008-12-20 12:07) [9]

А если серьезно.

> Ins ©   (20.12.08 10:52) [7]
>
> > oxffff ©   (19.12.08 20:00) [4]
>
>
> Свежая информация! ;-) Только я не понял, на что обратить
> внимание


> Ins ©  
>Ну, бывает же "старый новый год", так почему не быть "виртуальному >статическому методу" ;-)

К сожалению не быть ему никак.

Class Static Methods
Like class methods, class static methods can be accessed without an object reference. Unlike ordinary class methods, class static methods have no Self parameter at all. They also cannot access any instance members. (They still have access to class fields, class properties, and class methods.) Also unlike class methods, class static methods cannot be declared virtual.  

А почему так, рекомендую подумать.


 
Ins ©   (2008-12-20 12:45) [10]


> К сожалению не быть ему никак.


Спасибо, но мне это объяснять не нужно :) Та фраза про старый новый год - была в порядке шутки, ну да не твоя вина, видимо шутка неудачная. Но ты бы тоже почитал [3] до конца, я вроде там пытался объяснить, что автор спутал понятия, и static метод C# <> class method в Delphi, по причинам, которые ты неустанно мне тут цитируешь из справки :)


> class static methods cannot be declared virtual.  
>
> А почему так, рекомендую подумать.


А знаешь - заинтриговал! Если на вопрос, почему из class static нельзя, скажем, вызвать InstanceSize - понятно, дело в Self, то на вопрос, почему он не может быть виртуальным - мой ответ "по определению, и Self тут ни причем". А твой?


 
oxffff ©   (2008-12-20 14:23) [11]


> Ins ©   (20.12.08 12:45) [10]


Я тебе вопрос конкретный задал, почему методы с квалификатором static не могут быть виртуальными?


 
Ins ©   (2008-12-20 14:46) [12]


> Я тебе вопрос конкретный задал, почему методы с квалификатором
> static не могут быть виртуальными?


А чем тебя мой ответ не устроил? Технически этому ничто не мешает. Что значит виртуальный метод? Давай по пунктам:
1. Это значит, что адрес вызова не известен на этапе компиляции
2. Известно на этапе компиляции смещение этого метода в VMT класса, по которому компилятор сможет этот адрес найти.
3. Кроме смещения в VMT на момент вызова нужно иметь саму сслыку на VMT.

Со всеми ли пунктами согласен? Теперь допустим, что язык допускает существование виртуальных статик-методов. И при объявлении такого метода в классе он как и для всех других методов занесет его в VMT класса под известным ему смещением. Во что преобразуется вызов такого метода? Как и с любым другим виртуальным методом в три действия:
- Получение указателя на VMT (это Self, если метод вызван из метода без явного указания класса, или же класс при вызове указывается явно).
- Получение адреса из VMT по известному смещению
- Вызов, с передачей параметров
Отличие будет в том, что внутрь метода ссылка на класс, для которого метод выполняется, неявным параметром Self передана не будет.

Возвращаясь к вопросу "так почему же?", значит причина не техническая, а идеологическая. Мой ответ см. [3] (последнее предложение) и [10]. А твой?


 
Ins ©   (2008-12-20 14:50) [13]


>  И при объявлении такого метода в классе он как и для всех
> других методов занесет его в VMT класса под известным ему
> смещением.


Здесь ОН - это компилятор.


 
oxffff ©   (2008-12-20 21:29) [14]


> Ins ©   (20.12.08 14:46) [12]


Причина следующая.

Вызов статического предполагает вызов со статической линковкой. А это в свою очередь означает прямой вызов.

Вызов же статического виртуального метода предполагает по твоим словам предполагает косвенный вызов.
Что означает обязательное существования экземпляра в момент вызова.
Как ты собираешься гарантировать такой вызов?
А если делать вызов по compile time классу cсылки на экземпляр, то виртуальность просто не нужна.


 
Ins ©   (2008-12-20 21:50) [15]


> Что означает обязательное существования экземпляра в момент
> вызова.


Какого экземпляра? %-) С этого момента чуть подробнее, бо я сути не уловил.


 
oxffff ©   (2008-12-20 21:53) [16]


> Ins ©   (20.12.08 21:50) [15]


var a:tobject;
begin
a:=nil;
a.ClassName;


 
Ins ©   (2008-12-20 22:03) [17]

Вот пример. Предположим, что виртуальные статик-методы существуют. Что в этом коде по твоему не верно:
TFoo = class
protected
 class function GetClassAlias: String; static; virtual;
public
 class procedure Register;
end;

class fucntion TFoo.GetClassAlias: String;
begin
 Result := "Foo";
end;

class procedure TFoo.Register;
begin
 RegisterClassAlias(TFoo, GetClassAlias);
end;


А теперь убери слово static. Что изменилось? Да ничего, просто внутрь GetClassAlias теперь ссылка на VMT класса TFoo передается. Если static не убрать, то (если бы такое было возможно) не передавалась бы. И вся разница. Так как больше разницы между class-методами и class static методами не существует. Эта разница принципиальная, но только не в приведенном выше коде, она ничуть не делает его невозможным или бессмысленным. Технически ничто не мешает статик-методам быть виртуальными. Ровно на столько, как не статик, но class-методам ими быть. Но ты же не считаешь, что в виртуальных (не статик) классовых методах нет смысла?


 
Ins ©   (2008-12-20 22:10) [18]


> class procedure TFoo.Register;
> begin
>  RegisterClassAlias(TFoo, GetClassAlias);
> end;


Даже не так! А вот так!
class procedure TFoo.Register;
begin
RegisterClassAlias(Self, GetClassAlias);
end;


 
oxffff ©   (2008-12-20 22:19) [19]


> Ins ©   (20.12.08 22:03) [17]


Разница как раз в том, что классовый метод тянет за собой понятие метакласса.
Проблема в том, что в .NET понятия метакласс нет.
Есть экземпляр класса-описателя, то это совсем не то.
Зато оно есть в понятии Delphi.
А в Delphi.NET сделали класс обертку метакласса native Delphi+добавили обертку динамических методов.

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


 
Ins ©   (2008-12-20 22:24) [20]


> Разница как раз в том, что классовый метод тянет за собой
> понятие метакласса.
> Проблема в том, что в .NET понятия метакласс нет.
> Есть экземпляр класса-описателя, то это совсем не то.
> Зато оно есть в понятии Delphi.


Воооот! О чем я и толкую


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


Не нужна никакая ссылка на экземпляр, посмотри пример выше. Где там нужна валидная ссылка на экземпляр? А виртуальные class static не нужны по определению. Да как и сами class-static собственно, по крайней мере в Delphi for Win32. Ага, провокационная фраза! Ну щас на меня набросятся :))))


 
Ins ©   (2008-12-20 22:32) [21]

Да, кстати, обращаю внимание на:


> больше разницы между class-методами и class static методами
> не существует...Но ты же не считаешь, что в виртуальных (не статик) классовых методах нет смысла?


 
oxffff ©   (2008-12-20 22:37) [22]


> Ins ©   (20.12.08 22:24) [20]


Контракт RegisterClassAlias в студию.


 
oxffff ©   (2008-12-20 22:39) [23]


> Ins ©   (20.12.08 22:32) [21]


Я считаю, что смысл
в
class
class virtual
Class static
есть.
Нужно отчетливо представлять себе грань.
Я например отчетливо ее представляю.


 
Ins ©   (2008-12-20 22:39) [24]


> Контракт RegisterClassAlias в студию.


А это из Classes.pas:
procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);


 
oxffff ©   (2008-12-20 22:45) [25]


> Ins ©   (20.12.08 22:39) [24]


В чем суть твоего примера?
Суть моего примера в том, чтобы показать, что при отсутствии понятия метакласс вызов виртуального статического метода требует наличие экземпеляра.
И твой пример свалится на пустой ссылке на экземпляр

A:Tfoo;
a:=nil;
a.register;


 
Ins ©   (2008-12-20 22:57) [26]


> В чем суть твоего примера?


Суть в том, чтобы показать, что технически вызов виртуального статик-метода ничем не отличается от любого другого виртуального вызова.


> И твой пример свалится на пустой ссылке на экземпляр
>
> A:Tfoo;
> a:=nil;
> a.register;


Угу. Но причина в слове "virtual", а не в слове "static", не так ли? Убери virtual - не свалится, убери static - свалится все равно. Любой виртуальный метод требует ссылку, по которой можно найти VMT.
Отсюда вывод: разницы в вызове виртуального классового метода будь он статик, или не будь, не существует. Что возвращаясь к нашим баранам, а именно,
>А почему так, рекомендую подумать.
повторю свой ответ: по определению статик метода :-D Статик-метод, это аналог Java и .NET, в которых, как ты правильно заметил, нет ни метаклассов, ни виртуальных классовых методов.

ЗЫ: Можно больше не думать?


 
Ins ©   (2008-12-20 23:04) [27]


> Я считаю, что смысл
> в
...
> class virtual
...
> есть.


А как это стыкуется с:

> Как ты собираешься гарантировать такой вызов?
> А если делать вызов по compile time классу cсылки на экземпляр,
>  то виртуальность просто не нужна.


?


 
oxffff ©   (2008-12-20 23:06) [28]


> Угу. Но причина в слове "virtual", а не в слове "static",
>  не так ли? Убери virtual - не свалится, убери static -
> свалится все равно. Любой виртуальный метод требует ссылку,
>  по которой можно найти VMT.


Выше в [20] ты говорил, что не нужна эта ссылка. Теперь уже нужна.  :)

>Отсюда вывод: разницы в вызове виртуального классового метода будь он >статик, или не будь, не существует. Что возвращаясь к нашим баранам, а >именно,

Сам механизм вызова виртульных методов идентичен.
Но для гарантии безопасного вызова статический метод не может быть виртуальным. :)


 
oxffff ©   (2008-12-20 23:07) [29]


> Ins ©   (20.12.08 23:04) [27]


Есть маленький нюанс я могу делать вызов через метакласс. И не заботиться о существовании ссылки на экземпляр.


 
oxffff ©   (2008-12-20 23:08) [30]


> Ins ©   (20.12.08 23:04) [27]


А как насчет отличия обычного метода от статического виртуального.
В чем ты видишь глубокий смысл?


 
Ins ©   (2008-12-20 23:10) [31]


> oxffff ©   (20.12.08 23:06) [28]


Чушь полная, уж извини. Исходя из твоей логики, любой метод, не гарантирует безопасности, потому как вызови его по невалидной ссылке - свалится. Виртуальный свалится на 100%, а статический - как повезет :)


 
oxffff ©   (2008-12-20 23:11) [32]


> Ins ©   (20.12.08 23:10) [31]


Неа. [29].
А статический не свалится. На то он и статический поскольку в момент вызова известен метод который вызывается.


 
Ins ©   (2008-12-20 23:12) [33]


> Есть маленький нюанс я могу делать вызов через метакласс.
>  И не заботиться о существовании ссылки на экземпляр.


Я тоже :)


> А как насчет отличия обычного метода от статического виртуального.
> В чем ты видишь глубокий смысл?


Еще раз повторяю, что я в статик-методах ваащпе смысла не вижу =) Не то что в виртуальных. Я тебе отвечал на вопрос, почему class static methods cannot be declared virtual. Ты же сам просил?! =)


 
oxffff ©   (2008-12-20 23:14) [34]


> А статический не свалится. На то он и статический поскольку
> в момент вызова известен метод который вызывается.


Вызываешь метод класса гарантированно поскольку класс существует вне зависимости от существования или не существования экземпляров.


 
Ins ©   (2008-12-20 23:16) [35]


> А статический не свалится.


статический классовый с словом static? А статический instance-метод? А статический классовый, но без static? То то и оно. Что, выходит они тоже в топку, потому как не гарантируют безопасного вызова?


 
Ins ©   (2008-12-20 23:18) [36]


> статический классовый с словом static? А статический instance-
> метод? А статический классовый, но без static?


Если в них будет передан невалидный Self, то теперь все зависит от того, обращаются ли они к нему внутри или нет. Стоит обратиться - приплыли


 
oxffff ©   (2008-12-20 23:19) [37]


>
> Еще раз повторяю, что я в статик-методах ваащпе смысла не
> вижу =) Не то что в виртуальных. Я тебе отвечал на вопрос,
>  почему class static methods cannot be declared virtual.
>  Ты же сам просил?! =)


[34]. Я сейчас не могу привести пример. Но как то я понял интуитивно, что
корректней в данном случае сделать именно static, а не просто class или class virtual. Я бы срадостью поделился опытом использования static. Но просто сейчас не найду что,где, когда. :)


 
oxffff ©   (2008-12-20 23:20) [38]


> Ins ©   (20.12.08 23:16) [35]
>
> > А статический не свалится.
>
>
> статический классовый с словом static?


Он безконтекстный. Поэтому не свилиться.


 
oxffff ©   (2008-12-20 23:22) [39]


> не свилиться.


не свалится.


 
Ins ©   (2008-12-20 23:32) [40]


> Я бы срадостью поделился опытом использования static.


Ну а я бы в свою очередь с радостью бы послушал. Почему я их (class static) так не люблю, то вот ряд причин:
- Они чужие для идеологии Delphi и введены в язык "для галочки"
- Они полностью заменяемы гораздо более мощными class-методами Delphi
- В них происходит подмена понятий, когда класс вместо данных, и кода для доступа к ним, превращается просто в пространство имен, и его члены к данным класса отношения не имеют. Подменено также понятие метода, так как метод, это не то, что записывается через точечку, а то, куда передается ссылка на данные, для которых этот код выполняется
- В Java и .NET эти методы введены чисто ради того, чтобы можно было с чистой совестью заявить, что язык на 100% объектный, и от процедурного программирования в нем полностью отошли. Я считаю что такой прием - для лохов, но сути не меняет.


 
oxffff ©   (2008-12-20 23:45) [41]


> Ins ©   (20.12.08 23:32) [40


Все разумно.
В чем увидел силу, честно не помпю.
Я уже давно не программировал на Delphi по работе.
Так всякая шняга по мелочи.
А так чтобы жестокое ООП давно не было.
Последний раз в 2006. Вот там было ООП.
Вообщем не помню я.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.006 c
15-1227608723
Долетел
2008-11-25 13:25
2009.02.15
Управление удаленным компьютером по сети


15-1229364848
Anatoly Podgoretsky
2008-12-15 21:14
2009.02.15
Касперский спамит


3-1214894716
i
2008-07-01 10:45
2009.02.15
асинхронное выполнение ADOStoredProc


15-1229929438
Slider007
2008-12-22 10:03
2009.02.15
С днем рождения ! 20 декабря 2008 суббота


15-1229637458
Kostafey
2008-12-19 00:57
2009.02.15
Восстановление Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский