C# override metod - pomoc

C# override metod - pomoc
M1
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:29
0

Witam,

Mam dwie klasy A oraz B (przykładowa nazwa). Klasa B dziedziczy po klasie A.
W klasie B robię override metody Init z klasy A jednak różnica jest tylko w tym jaką wartość oraz typ będzie zawierać zmienna "variable" .
Chcę jednak uniknąć duplikowania kodu i użyć odwołania do base ale nie bardzo mam pomysł jak to zrobić.

Kopiuj
public class A
{
    public virtual void Init()
    {
        Method1();

        var variable = String.Equals("test", "test2");

        if (variable)
        {
            Method3();
        }
        Method2();
    }

    protected void Method1()
    {
        
    }

    protected void Method2()
    {
        
    }

    protected void Method3()
    {
        
    }
}



public class B : A
{
    public override void Init()
    {
        Method1();

        var variable = 4;

       if ((variable % 2) == 0)
        {
            Method3();
        }
        Method2();
    }
}


DE
  • Rejestracja:około 8 lat
  • Ostatnio:około 13 godzin
  • Postów:568
0

Różni się też warunkiem.
Robisz metodę generyczna, czyli typ w < >. Zmienna jako parametr metody, a drugi parametr to delegat będący warunkiem. Taka mała podpowiedź. Może napiszę kod jak będę później przy komputerze.

edytowany 1x, ostatnio: debugariusz
SA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 10 godzin
  • Postów:1435
0

Na pierwszy rzut oka wcale nie potrzebujesz, żeby Twoje Init było wirtualne. Taki design widziałbym bardziej z abstract class i ten warunek z if'a jako abstract member.

Kopiuj
using System;

public abstract class C
{
     protected abstract Func<bool> Condition {get;}
	
    public void Init()
    {
        Method1();

        if (Condition())
        {
            Method3();
        }
        Method2();
    }
		
   protected void Method1() {}
   protected void Method2() {}
   protected void Method3() {}  
}

public class A : C
{
	protected override Func<bool> Condition => () =>
	{
		var variable = String.Equals("test", "test2");
		return variable;
	};
}

public class B : C
{
	protected override Func<bool> Condition => () =>
	{
        var variable = 4;
        return variable % 2 == 0;
	};
}

Chociaż to takie gdybanie, średnio lubię patrzeć na kod w którym brakuje kontekstu. Zawsze tu może się kryć jakieś XY.

N0
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Gdańsk
  • Postów:647
0

Tak poza tematem, to czy wystawianie publicznej metody Init to na pewno dobry pomysł? Wygląda na temporal coupling. Nie da się tego wrzucić do konstruktora?

edytowany 1x, ostatnio: nobody01
SA
Nie uważasz, że trudno wnioskować coś o kodzie w którym nic nie ma? Cały wniosek wysnuwasz tylko z nazwy Init, która znaczy tak samo dużo co Method1 i Method2.
N0
Tylko pytam.
SA
Spoko, dla mnie to pytanie bardziej z języka niż z projektowania abstrakcji, bo do drugiego brakuje informacji co to jest, co ma robić, skąd te warunki pochodzą itd.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.