Установка значения в поле в производном классе - PullRequest
1 голос
/ 21 августа 2009
using System;

namespace ConsoleApplication1
{ 
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(new B("MyName").Name);
        }
    }

    abstract class A
    {
        public A(string name)
        {
            this.GetType().GetField("Name").SetValue(this, name);
        }
    }

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

        public string Name
        {
            set;
            get;
        }
    }
}

Можно ли сделать что-то подобное?

Ответы [ 5 ]

4 голосов
/ 21 августа 2009

Не могу не подчеркнуть, насколько это очень, очень, очень плохо. Вы создаете обратную связь, которая является запутанной, запутанной и надуманной, сильно не хватает ясности, не соответствует лучшим практикам и объектно-ориентированным принципам, что создаст кошмар обслуживания и управления для людей, реализующих производные вашего абстрактного класса. Делай правильно !!

abstract class A
{
    protected A(string name)
    {
        Name = name;
    }

    public abstract string Name
    {
        get;
        protected set;
    }
}

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

    private string m_name;

    public override string Name
    {
        get { return "B Name: " + m_name; }
        protected set
        {
           m_name = value;
        }
    }
}
1 голос
/ 21 августа 2009

Это действительно плохой поступок. Как правило, вы должны просто вызвать метод, такой как SetPossibleData (), и заставить всех детей реализовать его так, как они решат.

Зачем вам это нужно?

1 голос
/ 21 августа 2009

Возможно, но я бы не рекомендовал это делать. Проблема в том, что ваш базовый класс многое знает о классе, производном от него.

Когда вы наследуете класс от вашего абстрактного базового класса, который не определяет свойство Имя , вы получаете исключение во время выполнения.

Если вы ожидаете, что каждый класс, производный от вашего базового класса, имеет свойство Имя , тогда будет проще определить Свойство Имя в вашем абстрактном базовом классе. и установите свойство с вашим конструктором.

0 голосов
/ 21 августа 2009

Было бы очень просто, если бы каждый класс инициализировал поля и свойства, которые он определил. Почему B ожидает, что базовый класс инициализирует свое Имя?

abstract class A
{
    public A()
    {
    }
}

class B : A
{
    // I know, its trivial, but it does the same ...
    public B(string name) : base()
    {
        Name = name;
    }

    public string Name { set; get; }
}

Единственное, что я мог подумать о том, почему вы написали этот код, это то, что базовый класс имеет некоторую логику для инициализации поля. Прямо вперед - позволить производному классу вызывать логику, но инициализировать само поле:

abstract class A
{
    public A()
    {
    }

    protected string GenerateName(string someArg)
    {
        // complicated logic to generate the name
    }

}

class B : A
{
    public B(string someArg) : base()
    {
        Name = base.GenerateName(someArg);
    }

    public string Name { set; get; }
}
0 голосов
/ 21 августа 2009

Использовать метод GetProperty (),

public A(string name) 
    {
        this.GetType().GetProperty("Name").SetValue(this,name,null);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...