Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вызов перегрузки инициализации из инициализации


Автор: Resha 14.3.2008, 10:45
Ситуация:

Есть класс:

Код

public class Privet
{

// Перегрузка инициализации 1
public Privet(string Message, string Name)
{
Console.Write(Message + ", " + Name);
}

// Перегрузка инициализации 2
public Privet(string Message)
{
// Вызов перегрузки 1
Privet(Message, "Anonimous");
}

// Перегрузка инициализации 3
public Privet()
{
// Вызов перегрузки 1
Privet("Hi", "Anonimous");
}

}



Т.е. необходимо вызывать функцию инициализации, как обычную функцию. Какие есть наиболее эффективные в плане уменьшения количество копипастов (вариант с созданием дублирующей функции fn_Privet(string Message, string Name) и вызова её, вместо Privet(string Message, string Name) мне не подходит - слишком большое количество перегрузок и взаимосвязь м/д ними, в итоге получится около 10 лишних функций)?

Заранее спасибо smile

Автор: PashaPash 14.3.2008, 12:10
Resha, 
Код

...
// Перегрузка инициализации 2
public Privet(string Message) : this(Message, "Anonimous")
{

}
...

Автор: QryStaL 14.3.2008, 12:26
Код

    public class Privet
    {
        public Privet(string Message, string Name)
        {
            Console.Write(Message + ", " + Name);
        }
        public Privet(string Message) : this (Message, "Anonimous")
        {
        }
        public Privet() : this("Hi")
        {
        }
    }

Автор: Resha 14.3.2008, 13:25
Вижу, что упрощение кода упростило и ответы.

Предположим, что в случае

        public Privet(string Message)
        {
        }

Мне Name надо получить из файла дефолтовых настроек. Таким образом, ситуация расширяется до

Код

public class Privet
{
// Перегрузка инициализации 1
public Privet(string Message, string Name)
{
Console.Write(Message + ", " + Name);
}
// Перегрузка инициализации 2
public Privet(string Message)
{

(получение настроек из xml)

string Name = [имя из настроек]
// Вызов перегрузки 1
Privet(Message, Name);
}
// Перегрузка инициализации 3
public Privet()
{

(получение настроек из xml)

string Name = [имя из настроек]
string Message = [имя из настроек]
// Вызов перегрузки 1
Privet(Message, Name);
}
}


Как вызвать перегрузку инициализации с параметрами, получаемыми в другой перегрузке инициализации?

Автор: Dblma 14.3.2008, 13:31
Вместо вызова Privet(Message, Name); использовать this(Message, Name); 

Автор: Resha 14.3.2008, 13:54
Код

Class Privet
{

Privet(string Message, string Name)
{
}

Privet()
{
this("Hi", "Petya");
}

}


this - Ошибка - "Ожидается имя метода"

Автор: vponomarov 14.3.2008, 14:20
как вариант, можно сделать один (наиболее конкретный Privet(string Message, string Name)) конструктор в виде функции
тогда проблем с ее вызовом не будет

Автор: Resha 14.3.2008, 14:50
vponomarov, ну так в итоге и пришлось сделать smile Просто более красиво было бы, если бы избавление от абстракции шло постепенно. Это избавляет от необходимости множественного редактирования кода в случае внесения изменений в самую "неабстрактную" функцию (ту, в которой наибольшее количество параметров).

Да и еще хотелось бы предоставить возможность при инициализации класса, например, новостей (News) давать возможность как вывода одной новости (за которой по сути должен идти список других новостей), так и просто списка новостей, т.е.

Код

...

Public News()
{
(вывод списка новостей)
}

Public News(int Id)
{

(вывод новости Id)

News();

}

...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)