В C # я могу знать в базовом классе, что дети унаследовали от меня? - PullRequest
5 голосов
/ 19 ноября 2008

У меня есть автомобиль базового класса и некоторые детские классы, такие как автомобиль, мотоцикл и т. Д., Наследуемые от автомобиля. В каждом детском классе есть функция Go (); теперь я хочу регистрировать информацию о каждом транспортном средстве, когда функция Go () срабатывает, и по этому журналу я хочу знать, какой тип транспортного средства это сделал.

Пример:

public class vehicle 
{
      public void Go()
      {
           Log("vehicle X fired");
      }
}
public class car : vehicle
{
       public void Go() : base()
       {
           // do something
       }
}

Как узнать в функции Log, что машина звонила мне во время базы ()? Спасибо,

Омри

Ответы [ 4 ]

15 голосов
/ 19 ноября 2008

Вызов GetType() из Vehicle.Go () будет работать - но только если на самом деле вызывается Go ().

Одним из способов обеспечения этого является использование шаблона метода шаблона :

public abstract class Vehicle 
{
    public void Go()
    {
        Log("vehicle {0} fired", GetType().Name);
        GoImpl();
    }

    protected abstract void GoImpl();
}

public class Car : Vehicle
{
    protected override void GoImpl()
    {
        // do something
    }
}
4 голосов
/ 19 ноября 2008

this.GetType () даст вам тип текущего экземпляра

2 голосов
/ 19 ноября 2008

Ответ Джона Скита, безусловно, завершает работу, но мне, например, не очень нравится реализация. Я предпочитаю следующее, что делает это - по моему мнению - простым.

В любом случае .NET уже поддерживает эту функцию с помощью виртуальных методов.

public class Vehicle {
    public virtual void Go() {
          Log(this.GetType().Name);
    }
}

public class Car : Vehicle {
    public override void Go() {
         base.Go();
         // Do car specific stuff
    }
}

public class Bus : Vehicle {
}

Это будет работать, если вы ссылаетесь на экземпляр по его базовому классу или по фактическому классу. Это не вынуждает вас менять реализацию в базовых предложениях и ... все остальные объектно-ориентированные особенности .NET.

Если у вас есть полный контроль над реализацией базовых и производных классов, то эта реализация должна хорошо вам служить.

2 голосов
/ 19 ноября 2008

Как насчет этого:

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