Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос о статических методах и конструкторе / 6 сообщений из 6, страница 1 из 1
15.06.2013, 15:34
    #38298618
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о статических методах и конструкторе
Добрый день.
Ребята подскажите такую вещь: есть класс А и его наследник класс Б. Нужно реазизовать статический метод в классе А который будет создавать и возвращать экземпляр вызывающего класса, т.е. вызываем в классе А статический метод GetObject -получаем экземпляр А класса, вызываем в Б - экземпляр Б класса
public ClassA
{
...
public static ClassA GetObject(param)
{
//something
return new ???
}
}
...
Рейтинг: 0 / 0
15.06.2013, 16:51
    #38298638
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о статических методах и конструкторе
не выйдет
...
Рейтинг: 0 / 0
24.06.2013, 13:37
    #38308161
taj
taj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о статических методах и конструкторе
Если в контексте вызова известен тип, инстанс которого нужно вернуть - ну передай этот тип в числе параметров.
Что-нить по мотивам
private static T GetInstance<T>(Type t, params object[] param)
{
return (T)Activator.CreateInstance(t, param);
}

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

Может быть почитать про концепцию, фабрики, возвращающей интерфейс.
...
Рейтинг: 0 / 0
24.06.2013, 15:13
    #38308298
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о статических методах и конструкторе
Не получится, в стектрейсе даже информации по ClassB не будет, только базовый ClassA.

Можно вот так провернуть через нестатические методы (обязательно нужен override, тогда в стектрейсе можно выкурить наследуемый тип через первый фрейм). Но за такой код, конечно, нужно плеткой по губам отстёгивать...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class ClassA
{
    public virtual object GetObject()
    {
        var type = new StackTrace(0).GetFrame(1).GetMethod().DeclaringType;
        return Activator.CreateInstance(type == typeof(Program) ? typeof(ClassA) : type);
    }
}

public class ClassB : ClassA
{
    public override object GetObject()
    {
        return base.GetObject();
    }
}

public class ClassC : ClassA
{
    public override object GetObject()
    {
        return base.GetObject();
    }
}
...
Рейтинг: 0 / 0
24.06.2013, 15:30
    #38308331
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о статических методах и конструкторе
МСУобязательно нужен override, тогда в стектрейсе можно выкурить наследуемый тип через первый фреймОга, и тут пришел инлайнинг.

Код: plaintext
[MethodImpl(MethodImplOptions.NoInlining)]
...
Рейтинг: 0 / 0
24.06.2013, 15:33
    #38308341
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о статических методах и конструкторе
НахлобучМСУобязательно нужен override, тогда в стектрейсе можно выкурить наследуемый тип через первый фреймОга, и тут пришел инлайнинг.
Код: plaintext
[MethodImpl(MethodImplOptions.NoInlining)]

Бум-кабум, и снова неработающий код в сети.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос о статических методах и конструкторе / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]