【发布时间】:2020-01-13 17:53:08
【问题描述】:
我是 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,所以我非常习惯于依赖多次调度和做这种事情。我知道它在 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; }
}
我知道这是一个人为的例子,但它与我正在尝试做的类似。
【问题讨论】:
-
您可以使一种方法接受“大师班”并使用原样检查或其他方式。你也可以在 handlemasterclass 中做同样的事情
-
我没有提到,但是这些方法在一个单独的类中为此做一些事情
-
编辑显示
-
我个人喜欢这样做,因为我在阅读其他人的帖子时通常不会查看编辑历史记录,并且编辑说明会将您的 cmet 放在上下文中。将其视为解释编辑内容的代码注释,而不仅仅是编辑
-
一种解决方案是将项目转换为动态(SpecificMethod((dynamic) item))。不过我更喜欢强类型的解决方案。
标签: c# overloading