4

我的系统中有几个类

//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 属性。

我想知道我在上面所做的是否是对多态性的滥用,以及它是否以某种方式“破坏”了多态性。如果它滥用多态性,那么正确的方法是什么。

4

5 回答 5

1

这是完全有效的。TransService服务Transmit方法中使用了多态模式。它适用于可以morphed在一个或多个类中的类。

您使用基类或派生类声明变量的事实取决于您并取决于您的具体情况。

于 2013-09-27T14:57:40.873 回答
0

那应该完全没问题。在传输方法中,对象被称为 BaseTransmission,因此“向下转换”不太明显。(事先有这个评论,但这应该是一个答案)

于 2013-09-27T14:53:09.983 回答
0

好吧,这是完全有效的情况:当您使用基类类型时,就像 TransService.Trasmit方法中的基参数一样。

唯一看起来很奇怪的是:

protected internal abstract string Transmit();

真的需要protectedinternal吗?如果是,请跳过这个概念。

于 2013-09-27T14:53:36.690 回答
0

通常,您更喜欢使用基本类型

BaseTransmission emailTrans = new EmailTransmission();

这让你的抽象保持干净,并帮助你不要重复自己。这在以下场景中很有用:假设用户可以选择如何联系她/他(电子邮件、传真、文本)。当你需要发送一些东西时,你只有一个接受对象BaseTransmission和参数的方法,比如BaseParameter.

注意:如果看起来好像没有太多可以共享的代码,你可以定义一个接口ITransmitter,用它来显示一个类可以发送一些东西,比如:

ITransmitter transmitter = new EmailTransmission();
于 2013-09-27T15:06:14.113 回答
0

您正在做的事情是绝对正确的,应该可以毫无问题地工作。将子类传递给采用基类的函数/方法应该不是问题。

但是,关于您的示例:

这解决了我的目的。但是通常当我看到多态的例子时,我总是看到引用类型是基类类型,它指向一个子类类型的实例。所以通常在多态的典型例子中

EmailTransmission emailTrans = new EmailTransmission();

通常会是

BaseTransmission emailTrans = new EmailTransmission();

如果BaseTransmission是接口或抽象类,则完成此操作,然后您需要构造特定版本的BaseTransmission. 有时,如果您不需要额外的组件,有些人也喜欢使用它来保持他们的代码干净。最常见的用法是泛型,例如当您想创建一个List示例但需要实现特定版本的操作系统时List,例如ArrayListLinkedList

于 2013-09-27T15:10:13.670 回答