【发布时间】:2016-01-26 23:15:28
【问题描述】:
也许这是一个愚蠢的问题。但是,我不明白我错过了什么。
给定以下类定义
public abstract class AbstractBaseClass
{
public abstract void Create(AnotherAbstractClass param1);
}
Weras AnotherAbstractClass 已定义
public abstract class AnotherAbstractClass
{
}
具体实现
public class AnotherConcreteImplementation : AnotherAbstractClass
{
}
我希望能够覆盖 Create 方法以使用具体类型:
public class ConcreteImplementation : AbstractBaseClass
{
public override void Create(AnotherConcreteImplementation param1) <-- There is no suitable method for override
{
// param1 is an instance of the concrete implementation
}
public override void Create(AnotherAbstractClass param1) <-- this is working but I'll have to cast on each implementation
{
// param1 is an instance of the abstract class and needs a cast
}
}
这根本不可能,还是我不知道有什么方法?也许使用泛型?
编辑 #1(添加更多上下文)
我试图实现/强制在具体实现中只有一个参数有效。
把它想象成一个数据库层。 Create 方法将在数据库中创建一个新条目。由于每个表都有不同的值,create-parameter 也有。
可以使用AnotherAbstractClass 的任何具体实现来调用内部铸造的气味(在我看来)。
public class AddressTable : AbstractBaseClass
{
public override void Create(AnotherAbstractClass param1)
{
// cast to concrete instance
var casted = (ConcreteAddressCreate)param1;
}
}
public class CityTable : AbstractBaseClass
{
public override void Create(AnotherAbstractClass param1)
{
// cast to concrete instance
var casted = (ConcreteCityCreate)param1;
}
}
拥有AddressTable 的实例我可以调用
addressIntance.Create(new ConcreteAddressCreate()); // would be okay
另一方面,我可以称之为
addressIntance.Create(new ConcreteCityCreate()); // would be okay but will fail at runtime with InvalidCastException
编辑#2(附加信息)
以后还应该可以使用更多抽象方法扩展AbstractBaseClass 类。
因此,对我来说,更可能使用泛型方法而不是具体的类实现,每个方法要实现 200 个泛型参数。
【问题讨论】:
-
大声笑,每个人都用一个通用代码 sn-p 回答你,没有任何想法或真正的意图来帮助你,只是为了放弃一些观点。基本上你问的问题是可能的,但这是一个巨大的代码气味,真正的问题是你为什么认为你需要这个?你能给我们更多的背景信息吗,因为我相信有更好的类设计来实现你真正需要的东西。
-
@dustinmoris 我不回答只是废弃一些要点,我有很多这些,但对它们没有用处。我只是想向 OP 展示如何快速使用泛型来解决这个特定问题。我同意这看起来像代码味道。
-
@dustinmoris 这看起来不像是代码味道,而且没有人在“为积分报废”(无论如何,我很容易在积分上封顶,很有可能我真的没有积分回答这个问题)。
-
@dustinmoris 查看我更新的问题(试图澄清我的预期目标)
-
@BenjaminGruenbaum 作者询问如何通过重载将抽象类型转换为具体类型。对我来说这是一种代码味道,因为第一个问题应该是为什么他不能直接在抽象类型上工作?
标签: c# generics inheritance design-patterns abstract-class