Я новичок в C#, и я действительно хотел бы реализовать определенные c различные методы для каждого подтипа определенного абстрактного класса, но у меня возникли проблемы с выяснением, как заставить компилятор сделать это правильно , Например:
public abstract class MasterClass { }
public class SubClass1 : MasterClass { }
public class SubClass2 : MasterClass { }
public class SeparateClass
{
public void HandleMasterClass(MasterClass item)
{
/*
stuff generic to both subclasses...
*/
SpecificMethod(item)
}
public void SpecificMethod(SubClass1 item)
{
//something specific to SubClass1
}
public void SpecificMethod(SubClass2 item)
{
//something specific to SubClass2
}
}
Это возвращает ошибку при компиляции, потому что нет SpecificMethod(MasterClass item)
, но я действительно хочу, чтобы он выбрал правильный метод на основе подкласса без необходимости писать отдельный HandleMasterClass(SubClass1 item)
и HandleMasterClass(SubClass2 item)
методы, потому что они в основном один и тот же код
мой основной язык - Jula, поэтому я очень привык полагаться на множественную диспетчеризацию и делать подобные вещи. Я знаю, что это, вероятно, не idiomati c в C#, так как бы я сделал это лучше?
РЕДАКТИРОВАТЬ: показывая, что методы не являются бесплатными, но являются частью отдельного класса
здесь лучший конкретный пример
public abstract class MasterClass { public abstract int Stuff(); }
public class SubClass1 : MasterClass
{
public override int Stuff() { /*calculate and return an int*/ }
}
public class SubClass2 : MasterClass
{
public override int Stuff() { /*calculate and return an int*/ }
}
public class MasterClassDictionary
{
public Dictionary<int, SubClass1> subClass1Dict{get;} = new Dictionary<int, SubClass1>()
public Dictionary<int, SubClass2> subClass2Dict{get;} = new Dictionary<int, SubClass2>()
public void Add(MasterClass item)
{
int val = item.Stuff();
AddToDict(val, item);
}
void AddToDict(int val, SubClass1 item) { subClass1Dict[val] = item; }
void AddToDict(int val, SubClass2 item) { subClass2Dict[val] = item; }
}
Я знаю, что это немного надуманный пример, но он похож на то, что я пытаюсь сделать.