powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Виртуальные поля или как-то так...
11 сообщений из 11, страница 1 из 1
Виртуальные поля или как-то так...
    #38920415
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть базовый класс и два наследника. У наследников по полю-константе - всё одинаково - тип (int), имя, доступность (публично), только значение разное. Как сделать так, чтобы объявление было в базовом классе, а инициализация - в потомках?

Придумал сделать виртуальное свойство рид-онли (толко геттер). Но тогда для него нужно поле. Ну и инициализацию этого поля базового класса делать в конструкторе потомка.

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

Вывод программы:

100
200
0
0

а надо

100
200
100
200

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
    public abstract class Base
    {
        protected int _a;
        private int _b;

        public int A
        {
            get { return _a; }
        }

        public int B
        {
            get { return _b; }
        }

        public Base()
        {
            _b = _a;
        }
    }

    public class Derived1 : Base
    {
        public Derived1()
        {
            this._a = 100;
        }
    }

    public class Derived2 : Base
    {
        public Derived2()
        {
            this._a = 200;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            Derived1 d1 = new Derived1();
            Derived2 d2 = new Derived2();

            Console.WriteLine(d1.A);
            Console.WriteLine(d2.A);
            Console.WriteLine(d1.B);
            Console.WriteLine(d2.B);

            Console.ReadLine();
        }
    }

...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920417
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторполю-константе
У меня в примере не константы, но сути это не меняет.
...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920418
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При этом не хотелось бы в конструкторы унаследованных классов передавать значение для поля _a базового класса, чтобы потом это значение передать в конструктор базового класса - пользователь не должен задумываться, как оно там всё настраивается. Он должен просто создать объект такого-то класса и знать, что этот объект настроился так-то. А мне нужно удобство и для удобства хочу иметь забовый класс с таким вот полем.
...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920421
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, штука в том, что есть базовый класс, который содержит общие поля, и есть унаследованные классы, которые инициализируют эти поля каждый по-своему. При этом в базовом классе ещё проходит одинаковая по коду для всех унаследованных классов инициализация других вещей, но значение используется каждый раз своё - из унаследованного класса.
...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920424
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, Скит сказал, что порядок инициализации такой
http://stackoverflow.com/a/1882778/808128

Значит, только через падачу параметра в базовый конструктор...
...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920425
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока так. Но хотелось бы, чтобы не числа передавать в базовый конструктор, а осознанные переменные.

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
    public abstract class Base
    {
        protected int _a;
        protected int _b;

        public int A
        {
            get { return _a; }
        }

        public int B
        {
            get { return _b; }
        }

        public Base(int a)
        {
            _b = a;
        }
    }

    public class Derived1 : Base
    {
        public Derived1()
            : base(100)
        {
            this._a = 100;
        }
    }

    public class Derived2 : Base
    {
        public Derived2()
            : base(200)
        {
            this._a = 200;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            Derived1 d1 = new Derived1();
            Derived2 d2 = new Derived2();

            Console.WriteLine(d1.A);
            Console.WriteLine(d2.A);
            Console.WriteLine(d1.B);
            Console.WriteLine(d2.B);

            Console.ReadLine();
        }
    }

...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920427
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь так

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
    public abstract class Base
    {
        protected int _a;
        protected int _b;

        public int A
        {
            get { return _a; }
        }

        public int B
        {
            get { return _b; }
        }

        public Base(int a)
        {
            _b = a;
        }
    }

    public class Derived1 : Base
    {
        private const int _bb = 100;

        public Derived1()
            : base(_bb)
        {
            this._a = _bb;
        }
    }

    public class Derived2 : Base
    {
        private const int _bb = 200;

        public Derived2()
            : base(_bb)
        {
            this._a = _bb;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            Derived1 d1 = new Derived1();
            Derived2 d2 = new Derived2();

            Console.WriteLine(d1.A);
            Console.WriteLine(d2.A);
            Console.WriteLine(d1.B);
            Console.WriteLine(d2.B);

            Console.ReadLine();
        }
    }

...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920434
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал вспомогательные вещи, теперь функциональность, что мне хотелось, в чистом виде

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
    public abstract class Base
    {
        protected readonly int _b;

        public int B
        {
            get { return _b; }
        }

        public Base(int b)
        {
            _b = b;
        }
    }

    public class Derived1 : Base
    {
        private const int _valueForB = 100;

        public Derived1()
            : base(_valueForB)
        {
        }
    }

    public class Derived2 : Base
    {
        private const int _valueForB = 200;

        public Derived2()
            : base(_valueForB)
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Derived1 d1 = new Derived1();
            Derived2 d2 = new Derived2();

            Console.WriteLine(d1.B);
            Console.WriteLine(d2.B);

            Console.ReadLine();
        }
    }

...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920452
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох, ваще хорошо


Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
    public abstract class Base
    {
        protected readonly int _b;

        public int B
        {
            get { return _b; }
        }

        public Base(int b)
        {
            _b = b;
        }
    }

    public class Derived1 : Base
    {
        new private const int _b = 100;

        public Derived1()
            : base(_b)
        {
        }
    }

    public class Derived2 : Base
    {
        new private const int _b = 200;

        public Derived2()
            : base(_b)
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Derived1 d1 = new Derived1();
            Derived2 d2 = new Derived2();

            Console.WriteLine(d1.B);
            Console.WriteLine(d2.B);

            Console.ReadLine();
        }
    }

...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920477
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем этот цирк?
...
Рейтинг: 0 / 0
Виртуальные поля или как-то так...
    #38920491
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилзачем этот цирк?
Не мешай, я медитирую.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Виртуальные поля или как-то так...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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