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


Автор: Bogdan1024 18.9.2007, 15:20
Код

public class A{
public A(string a);
}
public class B : A {}

Как можно промаркировать конструкторы класса A, чтобы потом можно было писать такое:
Код

B b = new b("хочу, чтобы вызвался конструктор класса а!!!");

И при этом не указывать конструктор в классе B с такой же сигнатурой. Всмысле, не писать такое:
Код

public class B : A {
public B(string a)
:base(a)
{}
}

Ибо конструкторов у класса A может быть миллион, и наследников от А может быть миллион...

Автор: Jlekc 18.9.2007, 16:11
Ощибка в построении архитектуры.
При нормальном построении таких вопросов не возникает

Автор: Wanderer2019 18.9.2007, 16:12
ну.. гхм... насколько я понимаю такого сделать не получится... т.к. конструктор - это метод, описывающий элемент ДАННОГО типа. т.е. считается что для другого типа он должен быть иным, но никто тебе не мешает описать этот механизм с помощью дополнительного набора public методов родительского класса. Или же описать какую то логику в пропертях.

может я ошибаюсь и все же есть какой то свпособ???

Автор: Jlekc 18.9.2007, 17:24
Кстати, как понимаю просто не хочеться при наследовании описывать конструкторы базового класа.
Попробуй поставь ReSharper. 
В нем много подсказок и автозаполнений кода, возможно и это он сделает сам.

Автор: tol05 18.9.2007, 20:08
Цитата

Как можно промаркировать конструкторы класса A, чтобы потом можно было писать такое:
Код

B b = new b("хочу, чтобы вызвался конструктор класса а!!!");


Bogdan1024, возникает вопрос: знаешь ли ты зачем вообще конструкторы нужны и как они работают?
Как конструктор класса А может гарантировано инициализировать объекты всех своих классов-потомков, которые, может быть, будут созданы через сотни лет? Потомки напишут класс и крикнут: "ты гляди, еще на .Net 2.0 написали класс, а он до сих пор наши инстансы создает!!!" Вах!!!

Цитата(Jlekc @  18.9.2007,  17:24 Найти цитируемый пост)
Попробуй поставь ReSharper. В нем много подсказок и автозаполнений кода, возможно и это он сделает сам.

вряд ли...

Автор: mihryak 18.9.2007, 20:27
Цитата(tol05 @  18.9.2007,  21:08 Найти цитируемый пост)
Bogdan1024, возникает вопрос: знаешь ли ты зачем вообще конструкторы нужны и как они работают?

вопрос тут всё же о другом
автору просто хочет найти возможность избежать написания параметризированных конструкторов унаследованных классов, дублирующих по сигнатуре один из базовых конструкторов и ничего, кроме "вызова" base(parameter), не делающих...

Автор: tol05 18.9.2007, 21:23
не я C# придумал, но понять разработчиков могу... Я вот, например, так "хочу"
Код

    public class B : A
    {
        public B() : base("Hi!")
        {
            
        }

        public B(string a) : base()
        {
            
        }
    }

    public class A
    {
        public A(string a)
        {
            
        }

        public A() {}
    }

Как компилятор без явных вызовов базовых конструкторов отличит мой вариант от варианта Bogdan1024?

Автор: altarvic 19.9.2007, 06:41
Так не подойдет?

Код


public class A{

  public static A Create(string a)
  {
     return new A(a);
   }

   public A(string a) {}
}

public class B : A {}

...

B = A.Create("")





Да, написал не подумавши. Такое не прокатит

Автор: Alek86 19.9.2007, 08:57
не уверен, что понял до конца идею, но вопрос вдогонку:

а что, если 10000 из того миллиона наследников не должны будут вызывать конструктор A?

Автор: mihryak 19.9.2007, 09:50
проблемы будут и с закрытием для пользователя наследников расширенных конструкторов базового класса (часто, например, базовый абстрактный класс имеет конструкторы, которые в наследниках вызывать, так скажем, не стоит)

Автор: Bogdan1024 19.9.2007, 17:18
Значит, не получится так. Жаль.

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