Вопрос:

Различение базовых и производных классов в аргументах метода

c# overloading constructor-overloading

51 просмотра

4 ответа

19 Репутация автора

Можно ли перегрузить конструкторы в C #, чтобы программа решила использовать один конструктор, если аргумент имеет производный класс, и другой, если он является базовым классом. Например

class BaseClass {...}
class DerivedClass : BaseClass {...}

class foo
{


      public foo(DerivedClass bar)
      {
          //do one thing
      }

      public foo(BaseClass bar)
      {
          //do another
      }

}

То есть я хочу, чтобы программа выбирала правильный конструктор на основе типа объекта.

Автор: jjl3 Источник Размещён: 22.08.2016 08:33

Ответы (4)


1 плюс

6727 Репутация автора

Я думаю, что лучший ответ на ваш вопрос немного косвенный, но лучший примерный ответ на ваш вопрос будет выглядеть следующим образом:

Редактировать: исправить неправильное isиспользование синтаксиса и сделать его более конкретным

public foo(BaseClass foobar) {
     if (foobar?.GetType() == typeof(BaseClass)) {
      //do something
     }
     else { // do something different }    
}

При этом я не думаю, что это обязательно оптимальный способ структурировать ваш код; принятие решений на основе типа объекта может быть сигналом того, что пришло время использовать полиморфизм с помощью абстрактных / виртуальных классов и методов. Вам лучше IMO делать что-то вроде этого:

public BaseClass {
    public virtual void DoSomething() {...}
}

public DerivedClass : BaseClass {
    public override void DoSomething() {...}
}

public foo(BaseClass foobar) {
    foobar.DoSomething();    
}
Автор: Josh E Размещён: 22.08.2016 08:41

0 плюса

1130 Репутация автора

Если вы приведете свой объект в свой BaseClass, будет вызван хороший конструктор. Вот так:

void Main()
{
    var object2 = new DerivedClass();
    var temp = new Allo((BaseClass)object2);
}

public class Allo
{
    public Allo(BaseClass value)
    {
        Console.WriteLine("baseclass");
    }

    public Allo(DerivedClass value)
    {
        Console.WriteLine("derivedclass");
    }
}

public class BaseClass
{
}

public class DerivedClass : BaseClass
{
}

Выход:

baseclass
Автор: C1rdec Размещён: 22.08.2016 08:42

1 плюс

1777 Репутация автора

Я согласен со всеми остальными, что это похоже на запах кода, но если вы на самом деле скомпилируете свой код и запустите его, вы обнаружите, что он уже работает так, как вы этого хотите. Например, это делает именно то, что вы хотите, к лучшему или к худшему.

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

        var b = new BaseClass();
        var d = new DerivedClass();

        var f = new foo(d);
        //prints Derived Constructor
        var e = new foo(b);
        //prints Base Constructor
    }
}

public class BaseClass {

   public BaseClass()
    {
    }
}
public class DerivedClass : BaseClass
{
    public DerivedClass()
    {
    }
}
class foo
{


    public foo(DerivedClass bar)
    {
        //do one thing
        Console.WriteLine("Derived Constructor");
    }

    public foo(BaseClass bar)
    {
        Console.WriteLine("Base Constructor");
    }

}
Автор: Kolichikov Размещён: 22.08.2016 08:45

0 плюса

19 Репутация автора

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

[У меня было странное поведение, когда я тестировал как часть моего более крупного проекта ... но теперь я понимаю, что это было связано с другими ошибками в моем коде - напоминанием себе о необходимости реального тестирования - я впервые за четыре года Я занимался программированием, поэтому я забыл основы ...].

Автор: jjl3 Размещён: 22.08.2016 08:47
Вопросы из категории :
32x32