Как можно по условию переданному в конструктор, выбрать переопределяемые методы в C#

185
20 октября 2018, 13:50

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

Для примера:

public class A
{
    public virtual void TestA()
    {
        Console.WriteLine("test");
    }
    public virtual void TestB()
    {
        Console.WriteLine("test");
    }
}
public class B : A
{
    public B(bool condition) 
    {
        if (condition)
            // если true переопределить один метод, иначе два метода
    }
    public override void TestA()
    {
        Console.WriteLine("testA");
    }
}

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

Answer 1

При переопределении метода, всегда можно вызывать оригинальную реализацию через ключевое слово base:

public override void TestA() {
  if (this.condition)
    Console.WriteLine("TestA");
  else base.TestA();
}
Answer 2

Вам нужен не один класс, а два:

public class B : A
{
    public override void TestA()
    {
        Console.WriteLine("testA");
    }
}
public class B1 : B
{
    public override void TestB()
    {
        Console.WriteLine("testB");
    }
}

И такой простой фабричный метод:

public static class BFactory
{
    public static B Create(bool condition)
        => condition ? new B() : new B1();
}

Теперь, вместо использования конструктора new B(), используйте этот метод:

var b = BFactory.Create(/*здесь ваше выражение*/);
Answer 3

Uranus все правильно написал. Приведу просто полный код для класса B:

public class A
{
    public virtual void TestA()
    {
        Console.WriteLine("A: testA");
    }
    public virtual void TestB()
    {
        Console.WriteLine("A: testB");
    }
}
public class B : A
{
    private readonly bool _condition;
    public B(bool condition)
    {
        _condition = condition;
    }
    public override void TestA()
    {
        if (_condition)
            Console.WriteLine("B: testA");
        else
            base.TestA();
    }
}
READ ALSO
Дополнить интерфейс Unity, Custom Inspector

Дополнить интерфейс Unity, Custom Inspector

Появилось требование к дополнению интерфейса самого unity, и хотелось бы узнать, это вообще возможно или нет

200
С# ssh клиент добавить логин и пароль “su”

С# ssh клиент добавить логин и пароль “su”

Хочу создать консольное приложение, которые бы подключается к Linux серверу, делает бэкап и выгружает все это в exelПроблема встала на авторизации...

170
Не обновляется изображение в Image

Не обновляется изображение в Image

Есть <Image x:Name="Zoomage" Height="100" Width="150" RenderTransformOrigin="05,0

180
Миграция на Microsoft.EntityFrameworkCore.SqlServer и JetBrains Rider

Миграция на Microsoft.EntityFrameworkCore.SqlServer и JetBrains Rider

Нужно что бы работало вот так First EF Core Console Application

188