c# - 这是使用多态性的正确方法吗

标签 c# .net oop polymorphism

我的系统中有几个类

//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。因此,如果我将引用声明为 BaseTransmission 类型并将其指向 EmailTransmission 类型的实例,我将无法访问 EmailTransmission 的 EmailMetadata 属性。

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

最佳答案

这是完全正确的。多态模式用在 TransService 服务 Transmit 方法中。 它适用于可以在一个或多个类中变形的类。

您是使用基类还是派生类来声明变量取决于您的具体情况。

关于c# - 这是使用多态性的正确方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19053728/

相关文章:

php - 为什么 MVC 设计模式被广泛用于网站开发?

python 数据类作为 oop 抽象

Swift 2 - 核心数据 - 面向对象编程

c# - C#除法求余数和模数

c# - 我可以拦截通过 HTTP 上传到 IIS7 的文件并根据验证标准拒绝上传吗?

.net - 如何安装与.net 4.0兼容的json.net版本?

c# - 任务并行库WaitAll异常处理

c# - Entity Framework 中的双重自引用

c# - 不同值类型之间的除以零行为不一致

c# - 如何在 Mongo 集合中查找最新文档 (C#)