Помогите перевести с C#
От: Darooma Россия  
Дата: 25.05.11 19:13
Оценка:
Я вступаю в ваши ряды.
Нужно перевести код с C# на Nemerle.

 protected   SqlCommand BuildCommand(string commandtText, params SqlParameter[] parameters)
        {
            SqlCommand ret = new SqlCommand();
            ret.CommandType = CommandType.StoredProcedure;
            ret.CommandText = commandtText;

            ret.Parameters.AddRange(parameters.Where(n => n != null).ToArray());

            return ret;
        }

Вот, что у меня получилось, но не работает

 protected BuildCommand( commandtText:string, params  parameters:SqlParameter[]):SqlCommand
        {
            def ret:SqlCommand = SqlCommand();
            ret.CommandType = CommandType.StoredProcedure;
            ret.CommandText = commandtText;

            ret.Parameters.AddRange(parameters.Where(n => n != null).ToArray());
        }
Re: Помогите перевести с C#
От: Darooma Россия  
Дата: 25.05.11 19:32
Оценка:
Хотя, нет, с этим я уже разобрался, а вот с этим не могу.
Нужно без if..., а с match.


C#
if (skipEmpty == true && value == null)
                return null;


Nemerle
match(skipEmpty){
                | true => match(value)
                {
                    | null=>null 
                    | _ => () 
                }   
                | false => ()
            }
Re[2]: Помогите перевести с C#
От: catbert  
Дата: 25.05.11 19:35
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>C#

D>
D>if (skipEmpty == true && value == null)
D>                return null;
D>



match (skipEmpty, value)
{
| ( true, null) => null
| _ => ()
}
Re[2]: Помогите перевести с C#
От: Jack128  
Дата: 25.05.11 19:38
Оценка: -1
Здравствуйте, Darooma, Вы писали:

D>Хотя, нет, с этим я уже разобрался, а вот с этим не могу.

D>Нужно без if..., а с match.

зачем "нужно"?? если ты занимаешся механическим переводом кода, то им и занимайся.

замени if на when, подключи Nemerle.Imperetive (или как там этот namespace называется) , чтоб return появился — и не парь себе мозги

D>C#

D>
D>if (skipEmpty == true && value == null)
D>                return null;
D>


D>Nemerle

D>
D>match(skipEmpty){
D>                | true => match(value)
D>                {
D>                    | null=>null 
D>                    | _ => () 
D>                }   
D>                | false => ()
D>            }

D>
Re[3]: Помогите перевести с C#
От: Darooma Россия  
Дата: 25.05.11 20:14
Оценка:
Здравствуйте, catbert, Вы писали:

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



C>
C>match (skipEmpty, value)
C>{
C>| ( true, null) => null
C>| _ => ()
C>}
C>



protected  CreateParameter( name:string, value:object, skipEmpty: bool):SqlParameter
        {
            match(value, skipEmpty)
            {
                | (null, true) =>null
                | _ => ()
            }

            

            def param =   SqlParameter();
            param.ParameterName = string.Format("@{0}", name);
            param.Direction = ParameterDirection.Input;
            param.Value = value ?? DBNull.Value;
            param.SourceColumn = name;

            param;
        }


Ошибка — expected ?, got void in computation branch: the `null' literal is not a valid value of type void
Re[4]: Помогите перевести с C#
От: catbert  
Дата: 25.05.11 20:37
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>Ошибка — expected ?, got void in computation branch: the `null' literal is not a valid value of type void


А. Тогда надо прописать using Nemerle.Imperative; и написать:

match (skipEmpty, value)
{
| ( true, null) => return null;
| _ => ()
}


Но лучше:

using Nemerle.Extensions; // вместе с остальными using-ами

protected  CreateParameter( name:string, value:object, skipEmpty: bool):SqlParameter
        {
            match(value, skipEmpty)
            {
                | (null, true) =>null

                | _ => 
                    SqlParameter() <- {
                      ParameterName = string.Format("@{0}", name);
                      Direction = ParameterDirection.Input;
                      Value = value ?? DBNull.Value;
                      SourceColumn = name;
                   }
            }
        }
Re[3]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 20:47
Оценка: 1 (1)
Здравствуйте, catbert, Вы писали:

C>
C>match (skipEmpty, value)
C>{
C>| ( true, null) => null
C>| _ => ()
C>}
C>


Только так (конечно) работать не будет. Вместо () нужно какое-то значение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 20:51
Оценка:
Здравствуйте, catbert, Вы писали:

C>
C>using Nemerle.Extensions; // вместе с остальными using-ами
C>                      ParameterName = string.Format("@{0}", name);
C>

Вот этот string.Format("@{0}", name) я бы заменил на: $"@$name" или еще лучше на "@" + name
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 20:53
Оценка:
Здравствуйте, catbert, Вы писали:

C>
C>            match(value, skipEmpty)
C>            {
C>                | (null, true) =>null
C>                | _ => 
C>

здесь теряется случай (null, false). На него наверно исключение надо генерировать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Помогите перевести с C#
От: catbert  
Дата: 25.05.11 21:19
Оценка:
Здравствуйте, VladD2, Вы писали:

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


C>>
C>>            match(value, skipEmpty)
C>>            {
C>>                | (null, true) =>null
C>>                | _ => 
C>>


VD>здесь теряется случай (null, false). На него наверно исключение надо генерировать.


По логике, все так и должно быть: если skipEmpty == false, то генерируется запрос даже для null-a. Дальше по коду ?? используется.
Re[5]: Помогите перевести с C#
От: Ziaw Россия  
Дата: 26.05.11 01:32
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>Но лучше:


Можно еще использовать то, что для параметров матч писать не обязательно

using Nemerle.Extensions; // вместе с остальными using-ами

protected CreateParameter(name : string, value : object, skipEmpty : bool) : SqlParameter
{
  | (_, null, true) => // либо, для читабельности, _ when value == null && skipEmpty
    null

  | _ => 
    SqlParameter() <- {
      ParameterName = "@" + name;
      Direction = ParameterDirection.Input;
      Value = value ?? DBNull.Value;
      SourceColumn = name;
    }
}
Re[6]: Помогите перевести с C#
От: Darooma Россия  
Дата: 26.05.11 05:26
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


Z>protected CreateParameter(name : string, value : object, skipEmpty : bool) : SqlParameter

Z>{
Z> | (_, null, true) => // либо, для читабельности, _ when value == null && skipEmpty
Z> null

Z> | _ =>

Z> SqlParameter() <- {
Z> ParameterName = "@" + name;
Z> Direction = ParameterDirection.Input;
Z> Value = value ?? DBNull.Value;
Z> SourceColumn = name;
Z> }
Z>}
Z>[/nemerle]

Я не знаю как этот вариант (когда прийду домой, скажу), но вот этот вариант не работает


protected  CreateParameter( name:string, value:object, skipEmpty: bool):SqlParameter
        {
            match(value, skipEmpty)
            {
                | (null, true) =>null

                | _ => 
                    SqlParameter() <- {
                      ParameterName = string.Format("@{0}", name);
                      Direction = ParameterDirection.Input;
                      Value = value ?? DBNull.Value;
                      SourceColumn = name;
                   }
            }
        }

А вот такой работает

protected  CreateParameter( name:string, value:object, skipEmpty: bool):SqlParameter
        {
            match(value, skipEmpty)
            {
                | (null, true) =>null

                | _ => 
                   def param = SqlParameter();
                      param.ParameterName = string.Format("@{0}", name);
                      param.Direction = ParameterDirection.Input;
                      param.Value = value ?? DBNull.Value;
                      param.SourceColumn = name;
                      param;
            }
        }

Что означает оператор <-?
Re[6]: Помогите перевести с C#
От: Darooma Россия  
Дата: 26.05.11 05:30
Оценка:
Здравствуйте, VladD2, Вы писали:

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


C>>
C>>using Nemerle.Extensions; // вместе с остальными using-ами
C>>                      ParameterName = string.Format("@{0}", name);
C>>

VD>Вот этот string.Format("@{0}", name) я бы заменил на: $"@$name" или еще лучше на "@" + name
Чем это лучше? Это означает $ в выражении $"@$name"?
Re[7]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 26.05.11 05:58
Оценка:
VD>>Вот этот string.Format("@{0}", name) я бы заменил на: $"@$name" или еще лучше на "@" + name
D>Чем это лучше?
Форматирование завязанное на порядковые номера аргументов "{0} {1} {3} {2}" — ненаглядно, и легко может привести к run-time ошибкам. "@" + name — в данном случае тупой и весьма оптимальный способ.


D>Это означает $ в выражении $"@$name"?

Вот в этой статье Влада было
Автор(ы): Сергей Туленцев, Владислав Чистяков
Дата: 23.05.2006
Производительность труда программиста в основном зависит от самого программиста. Однако даже самый опытный и знающий программист мало что может без подходящего инструмента. Эта статья открывает цикл статей об одном из таких инструментов, еще мало известном среди программистов, но очень многообещающем. Язык Nemerle, о котором пойдет речь в этих статьях, на первый взгляд очень похож на слегка улучшенный C#, но привносит многое из передовых исследовательских языков. Данная статья рассказывает об отличиях Nemerle от C# (как наиболее близкого языка)и является неформальным введением в язык.
:

Строка, начинающаяся со знака «$», может иметь в себе, скажем так, активные области (splices). Если внутри строки встречается одиночный символ «$», и дальше идет выражение, то его значение вычисляется и преобразуется в строку путем вызова у результирующего объекта метода ToString(). В качестве выражения может выступать идентификатор или произвольное выражение, взятое в скобки.


Вот сравни наглядность таких выражений:

C#:
throw new InvalidArgumentException(string.Format("Неверная операция {0} для объекта {1} в состоянии {2}", cmd.OperationType, obj, obj.State));


Nemerle:
throw InvalidArgumentException($"Неверная операция $(cmd.OperationType) для объекта $obj в состоянии $(obj.State)");


Ещё интересно, что $-строка — это не захардкоженная функция языка, а макрос.
Re[8]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 26.05.11 06:11
Оценка:
Подумал что стоит добавить ещё то что в $-строках можно производить вычесления (изредка бывает удобно), и для того чтобы в такой строке вывести сам символ $ его нужно записать два раза. Пример:
Console.WriteLine($"Посчитаем в $$-строке $(Math.Max(3 * 10, 5 + 2 * 10))");

выводит:

Посчитаем в $-строке 30

Re[7]: Помогите перевести с C#
От: _Raz_  
Дата: 26.05.11 07:20
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Что означает оператор <-?

[Snippets]Обновленный макрос with
Автор: catbert
Дата: 13.12.10
... << RSDN@Home 1.2.0 alpha 5 (M6) rev. 1511>>
Re[8]: Помогите перевести с C#
От: Darooma Россия  
Дата: 26.05.11 07:32
Оценка: :)))
Здравствуйте, hi_octane, Вы писали:


_>Вот сравни наглядность таких выражений:


_>C#:

_>
_>throw new InvalidArgumentException(string.Format("Неверная операция {0} для объекта {1} в состоянии {2}", cmd.OperationType, obj, obj.State));
_>


_>Nemerle:

_>
_>throw InvalidArgumentException($"Неверная операция $(cmd.OperationType) для объекта $obj в состоянии $(obj.State)");
_>


_>Ещё интересно, что $-строка — это не захардкоженная функция языка, а макрос.


У C# нагляднее.
Re[9]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 26.05.11 08:57
Оценка: +1
D>У C# нагляднее.
Вопрос привычек. Подход C# вводит лишнюю сущность — порядок аргументов. Причём ненадёжную в двух местах сразу — во время компиляции не выполняются ни проверки на число аргументов, ни проверки на их порядок.
Но если тебе удобно — пиши в стиле C#.
Re: Помогите перевести с C#
От: Darooma Россия  
Дата: 26.05.11 11:39
Оценка:
Вот еще кое-что


//1
 protected   T ExecuteReader<T>(IDbCommand command, Func<IDataReader, T> func, bool isSingleRow = false)
        {
            
            using (var connection = new SqlConnection(this.ConnectionString))
            {
               //....................................
                using (IDataReader reader = command.ExecuteReader(combehavior))
                {
                    return func(reader);
                }
            }
        }

//2
        protected void ExecuteReader(IDbCommand command, Action<IDataReader> action, bool isSingleRow = false)
        {
            using (var connection = new SqlConnection(this.ConnectionString))
            {
               //....................................
                using (IDataReader reader = command.ExecuteReader(combehavior))
                {
                    action(reader);
                }
            }
        }


 private IEnumerable<BEArticle> Fill(SqlCommand command)
        {
            //3
            List<BEArticle> article = ExecuteReader(command, reader =>  article = reader.GetBEArticle().ToList());

//4
            for (int  i = 0; i < article.Count; i++)
            {
                article[i].Category = category[i];
                yield return article[i];
            }
        }


1. Что лучше передавать в качестве функции в Nemerle: делегат f:Func<IDataReader, T> func или функцию f:IDataReader->T ?
Как будет выглядеть конструкция с using (var connection = new SqlConnection(this.ConnectionString)) ?

2. Есть ли в Nemerle параметры по-умолчанию?
3. Есть ли в Nemerle extension методы?
4. Есть ли в Nemerle циклы for и yield return?
Re[7]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.11 12:47
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Чем это лучше? Это означает $ в выражении $"@$name"?


http://nemerle.org/wiki/Lexical_structure_%28ref%29#String_literals
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.11 12:55
Оценка: +1
Здравствуйте, Darooma, Вы писали:

D>У C# нагляднее.


Это не у C#, а в библиотеке дотнет. Можешь использовать ее. Но по факту этот подход значительно менее удобен, так как ко всему прочему еще не позволяет выводить содержимое коллекций. Почитай внимательно документацию. Там есть пример выводящий содержимое коллекции (с помощью сплайса ..$). Это очень упрощает преобразгование в текст.

Потом в VS для $-строк есть подсветка, что делает их чтение очень удобным. В прочем, для {0} подсветка тоже имеется.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.11 12:58
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Я не знаю как этот вариант (когда прийду домой, скажу), но вот этот вариант не работает


Оператор <- объеявлен в пространстве имен Nemerle.Extensions. Его надо открыть перед использованием макроса.

D>Что означает оператор <-?


Инициализатор. Не что вроде C#-пного инициализатора коллекций но несколько круче. Позволяет рекурсивную инициализацию и инициализацию уже созданных объектов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 26.05.11 13:04
Оценка: 3 (1)
D>1. Что лучше передавать в качестве функции в Nemerle: делегат f:Func<IDataReader, T> func или функцию f:IDataReader->T ?
D>Как будет выглядеть конструкция с using (var connection = new SqlConnection(this.ConnectionString)) ?
Практически точно также:
using(def connection = SqlConnection(this.ConnectionString))
{
}

//есть версия с перехватом исключений в блоке:
using(def connection = SqlConnection(this.ConnectionString))
{
}
catch
{
  | e is SqlException => Console.WriteLine("Не соединились!");
}



D>2. Есть ли в Nemerle параметры по-умолчанию?

Да.
public static Test(i : int = 5) : void


D>3. Есть ли в Nemerle extension методы?

Да. Только их не обязательно выносить в статический класс, в обычных тоже можно объявлять. public static почему-то оставили, хотя имхо было бы удобнее если бы можно было иметь и локальные и экземплярные тоже
public static Ext(this s : string) : string


D>4. Есть ли в Nemerle циклы for и yield return?


for(mutable i=0; i<10; i++)
{
  Console.WriteLine(i);
}

//есть возможность добавить блок "иначе" выполняющийся если тело цикла не выполнялось:

for(mutable i=0; i<-10; i++)
{
  Console.WriteLine(i);
} otherwise
{
  Console.WriteLine("Цикл не выполнялся вовсе!");
}


yield конечно есть, но return не нужен.


YieldTest() : IEnumerable[string]
{
  yield "aaa";
  yield "bbb";
}


Пока что yield не работает в локальных функциях.
Re[2]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.11 13:06
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>1. Что лучше передавать в качестве функции в Nemerle: делегат f:Func<IDataReader, T> func или функцию f:IDataReader->T ?


Если не предполагается использовать функцию за пределами Немерле, то лучше IDataReader -> T. Если предполагается использовать функцию, например, из C#, то делегат, так как с функциональным объектов в шарпе будет туго.

D>Как будет выглядеть конструкция с using (var connection = new SqlConnection(this.ConnectionString)) ?

using (connection = SqlConnection(this.ConnectionString))
// или 
using (def connection = SqlConnection(this.ConnectionString))


D>2. Есть ли в Nemerle параметры по-умолчанию?


Да, но инициализировать можно только литералами. Синтаксис как в шарпее: x = null. При этом можно не указывать тип параметра.

D>3. Есть ли в Nemerle extension методы?


Да.

D>4. Есть ли в Nemerle циклы for и yield return?


Да. В for важно чтобы переменная была mutable. Плюс вместо for лучше применять
foreach (i in [0..x.Length])
  ..

или даже
foreach (elem in collection whith i)
  ..

последний вариант удобен если индекс и элемент нужны одновременно.

yield модно применять как внутри метода, так и внутри выражения (см. ComputationExpressions).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.11 16:55
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z> | (_, null, true) => // либо, для читабельности, _ when value == null && skipEmpty


Э... это только ухудшит читабельность. Да и производительность тоже.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Помогите перевести с C#
От: Darooma Россия  
Дата: 28.05.11 05:54
Оценка:
Спасибо, познавательно.

Есть ли в Nemerle статические виртуальные методы?

Помогите перевести вот это

//1
    T ExecuteReader<T>(IDbCommand command, Func<IDataReader, T> func, bool isSingleRow = false)
        {
            var combehavior = isSingleRow ? CommandBehavior.SingleRow : CommandBehavior.Default;
            using (var connection = new SqlConnection(this.ConnectionString))
            {
                command.Connection = connection;
                connection.Open();

                using (IDataReader reader = command.ExecuteReader(combehavior))
                {
                    return func(reader);
                }
            }
        }

//2
    BEArticle GetSingle(int? id, string friendlyUrl)
        {
            var command = /////////////................................;

            return ExecuteReader(command, reader =>
            {
               BEArticle article = reader.GetBEArticle().Single();

               if (reader.NextResult())
                   article.Category = reader.GetBECategory().Single();

               
                return article;
            });
        }

Как будут выглядеть этоти методы
а) с использованием делегата Func<IDataReader, T> func
б) с использование функции func:IDataReader->T
Re[2]: Помогите перевести с C#
От: hardcase Пират http://nemerle.org
Дата: 28.05.11 07:11
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>Спасибо, познавательно.


D>Есть ли в Nemerle статические виртуальные методы?


Статические виртуальные методы не нужны.

D>Помогите перевести вот это


D>[c#]

D>//1
D> T ExecuteReader<T>(IDbCommand command, Func<IDataReader, T> func, bool isSingleRow = false)
D> {
D> var combehavior = isSingleRow ? CommandBehavior.SingleRow : CommandBehavior.Default;
D> using (var connection = new SqlConnection(this.ConnectionString))
D> {
D> command.Connection = connection;
D> connection.Open();

D> using (IDataReader reader = command.ExecuteReader(combehavior))

D> {
D> return func(reader);
D> }
D> }
D> }

Можно переписать в аналогичный метод, а можно и макрос изобразить.
Метод:
ExecuteReader[T](command : IDbCommand, func : IDataReader -> T /* разницы с делегатом не будет */, isSingleRow : bool = false) : T
{
  def combehavior = if(isSingleRow) CommandBehavior.SingleRow else CommandBehavior.Default;
  using (connection = SqlConnection(this.ConnectionString))
  {
    command.Connection = connection;
    connection.Open();
    using (reader = command.ExecuteReader(combehavior))
    {
      func(reader)
    }
  }
}


GetSingle(id : int?, friendlyUrl : string) : BEArticle
{
  def command = /////////////................................;

  ExecuteReader(command, reader =>
  {
     def article = reader.GetBEArticle().Single();

     when(reader.NextResult())
       article.Category = reader.GetBECategory().Single();

     article;
  });
}


Макрос (не проверялось)
...
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;

namespace MyDataMacros
{
  macro ExecuteReader(command, body, reader = null)
    syntax("query", Optional(reader), "(", command ")", body)
  {
    ExecuteReaderImpl.Build(command, body, reader, false)
  }

  macro ExecuteSingleRowReader(command, body, reader = null)
    syntax("query" "single", Optional(reader), "(", command ")", body)
  {
    ExecuteReaderImpl.Build(command, body, reader, true)
  }

  module ExecuteReaderImpl
  {
    public Build(command : PExpr, body : PExpr, reader : PExpr, isSingleRow : bool) : PExpr
    {
      match(reader)
      {
        | null with readerName = <[ $("reader" : usesite) ]>
        | <[ $(readerName : name) ]> =>
          def executeArgs = if(isSingleRow) [ <[ CommandBehavior.SingleRow ]>] else [];
          <[
            def command = $command;
            using (connection = SqlConnection(this.ConnectionString))
            {
              command.Connection = connection;
              connection.Open();
              using ($(readerName : name) = command.ExecuteReader(..$executeArgs))
              {
                $body
              }
            }
          ]>

        | x =>
          Message.Error(x.Location, $"expected identifier, got `$x'"); <[ () ]>
      }
    }
  }
}

...

GetSingle(id : int?, friendlyUrl : string) : BEArticle
{
  def command = /////////////................................;

  query(command) // переменая reader доступна внутри блока
  {
     def article = reader.GetBEArticle().Single();

     when(reader.NextResult())
       article.Category = reader.GetBECategory().Single();

     article
  }
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Помогите перевести с C#
От: Darooma Россия  
Дата: 28.05.11 09:52
Оценка:
D>>Есть ли в Nemerle статические виртуальные методы?

H>Статические виртуальные методы не нужны.


Мне нужны. Они есть?
Если нет, то какая альтернатива?



>>GetSingle(id : int?, friendlyUrl : string) : BEArticle

>>{
>> def command = /////////////................................;

>> ExecuteReader(command, reader =>

>> {
>> def article = reader.GetBEArticle().Single();

>> when(reader.NextResult())

>> article.Category = reader.GetBECategory().Single();

>> article;

>> });
>>}
Почему лямбда выражение здесь на Nemerle выглядит также ( ExecuteReader(command, reader => ......) ), как в C#? У них же синтаксис разный.
Re[4]: Помогите перевести с C#
От: hardcase Пират http://nemerle.org
Дата: 28.05.11 12:45
Оценка:
Здравствуйте, Darooma, Вы писали:


D>>>Есть ли в Nemerle статические виртуальные методы?


H>>Статические виртуальные методы не нужны.


D>Мне нужны. Они есть?


Их нет потому что они практически бессмысленны с точки зрения системы типов .NET.

D>Если нет, то какая альтернатива?


Огласите задачу, которую хотите решить этим способом. "Статический" виртуальный метод можно свести к обычному.


D>Почему лямбда выражение здесь на Nemerle выглядит также ( ExecuteReader(command, reader => ......) ), как в C#? У них же синтаксис разный.


Это макрос =>. Хочется разного — пиши:
fun(reader) 
{
...
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.11 13:14
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Мне нужны. Они есть?

D>Если нет, то какая альтернатива?

Паттерн синглтон.

D>Почему лямбда выражение здесь на Nemerle выглядит также ( ExecuteReader(command, reader => ......) ), как в C#? У них

же синтаксис разный.

=> — это стандартный макрос. Автоматизирован соответствующим макросом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Помогите перевести с C#
От: Darooma Россия  
Дата: 28.05.11 13:27
Оценка:
Здравствуйте, hardcase, Вы писали:

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



D>>>>Есть ли в Nemerle статические виртуальные методы?


H>Огласите задачу, которую хотите решить этим способом. "Статический" виртуальный метод можно свести к обычному.



Есть множество страниц asp.net, у каждой из которой имеется статический метод GetPageUrlWithParams(.....). Он статический потому, что он одинаков для всех объектов данного класса (страницы), а также для того, чтобы к нему можно было обратиться напрямую в вызывающем коде.

В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ). Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику.
Re[5]: Помогите перевести с C#
От: Darooma Россия  
Дата: 28.05.11 13:33
Оценка:
Здравствуйте, VladD2, Вы писали:

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


D>>Мне нужны. Они есть?

D>>Если нет, то какая альтернатива?

VD>Паттерн синглтон.


Он не подойдет для использования в классах (MyPage1, MyPage2, MyPage3), производных от asp.net страницы (System.Web.UI.Page, если я не ошибаюсь). У этих классов может быть множество объектов. Ведь каждый раз при обращении к странице создается новый объект.
Re[6]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.11 14:18
Оценка:
Здравствуйте, Darooma, Вы писали:

VD>>Паттерн синглтон.


D>Он не подойдет для использования в классах (MyPage1, MyPage2, MyPage3), производных от asp.net страницы (System.Web.UI.Page, если я не ошибаюсь). У этих классов может быть множество объектов. Ведь каждый раз при обращении к странице создается новый объект.


Я отвечал на вопрос "какая есть замена для виртуальных статических методов".

Синглтоном конечно нужно делать отдельный класс. И уже его использовать из своих страниц.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Помогите перевести с C#
От: hardcase Пират http://nemerle.org
Дата: 28.05.11 20:13
Оценка: +1
Здравствуйте, Darooma, Вы писали:

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


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

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


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


H>Зачем такой метод делать статическим?


Он статический потому, что он одинаков для всех объектов данного класса (страницы), а также для того, чтобы к нему можно было обратиться напрямую в вызывающем коде.
Re[8]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.05.11 15:59
Оценка:
Здравствуйте, Darooma, Вы писали:

Это:

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


И это:

D>Он статический потому, что он одинаков для всех объектов данного класса (страницы), а также для того, чтобы к нему можно было обратиться напрямую в вызывающем коде.


Взаимно-противоречивые требования.

И вообще что-то ты очень сильно мудришь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 05:42
Оценка:
Здравствуйте, VladD2, Вы писали:


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



 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";} }
}

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

Как по-другому я не знаю. Response.Redirect("/Secure/App/MyPage.aspx") не подходит.
Re[10]: Помогите перевести с C#
От: catbert  
Дата: 30.05.11 07:23
Оценка: +1
Здравствуйте, Darooma, Вы писали:

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


Просто снимите модификатор static и добавьте virtual. Это как раз сценарий использования для virtual, если я все понимаю правильно.

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

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


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


C>Просто снимите модификатор static и добавьте virtual. Это как раз сценарий использования для virtual, если я все понимаю правильно.


C>Диспетчеризация виртуальных вызовов проводится как раз "по классовому принципу".


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


void Foo(){
if (good)
    Response.Redirect(/*????*/);
}
Re[12]: Помогите перевести с C#
От: catbert  
Дата: 30.05.11 08:26
Оценка:
Может я не понимаю чего-то, но почему не так?

void Foo(){
if (good)
    Response.Redirect(this.PageUrl);
}
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>Без статического метода никак.


Виртуальный он зачем?
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...
Пока на собственное сообщение не было ответов, его можно удалить.