我有几个班在我的系统这是使用多态性
//this was not made an Interface for some WCF reasons
public abstract class BaseTransmission
{
protected internal abstract string Transmit();
//other common properties go here
}
和几个子类像
public class EmailTransmission : BaseTransmission
{
//This property is added separately by each child class
public EmailMetadata Metadata { get; set; }
protected internal override string Transmit()
{
//verify email address or throw
if (!Metadata.VerifyMetadata())
{
throw new Exception();
}
}
}
在其他地方以正确的方式,我创建了一个方法与签名Transmit(BaseTransmission transmission)
。我从我的代码的另一部分调用这种方法是这样的:
TransService svc = new TransService();
EmailTransmission emailTrans = new EmailTransmission(); // this inherits from BaseTransmission
svc.Transmit(emailTrans);
这解决了我的目的。但通常当我看到多态性的例子时,我总是看到引用类型是基类类型,并且它指向了子类类型的一个实例。所以在多态性
的典型例子,通常EmailTransmission emailTrans = new EmailTransmission();
通常会
BaseTransmission emailTrans = new EmailTransmission();
我不能这样做,因为EmailTransmission EmailMetadata不同于可以说FaxMetadata。因此,如果我将引用声明为BaseTranmission类型并将其指向EmailTranmission类型的实例,则我将无法访问EmailTransmission的EmailMetadata属性。
我想知道我在上面做的是多态的滥用以及是否以某种方式“破坏”了多态。如果它滥用多态性,那么做到这一点的正确方法是什么。
是的,这对我来说很好。该服务本身与基类一起工作,所以你应该没问题。 – Jeff
您使用'BaseTransmission'类型的变量的原因是因为代码不关心实际类型是什么。这很典型,因为它只会调用'BaseTransmission'类型的方法。但是,由于您正在调用某个子类中的特定于类型的方法,因此您必须使用该类型的变量。这段代码没有错。 –
得到我的一件事就是你的评论“这个属性是由每个孩子班级单独添加的”。所以这听起来像BaseTransmission的所有孩子将有一个元数据属性。我想知道在理想情况下,您是否有Metadata的接口或基类,并在BaseTransmission中公开访问器。尽管如此,它是完美无瑕的,绝对没有什么是坏的。 –