C# 实践中的多态性#

C# 实践中的多态性#,c#,polymorphism,C#,Polymorphism,所以我现在有一个通讯录程序(故意是基本的,因为我不想写更多的花哨的东西),所以正在做一个评估模块(这不是学校作业) 我必须在这个模块中演示多态性、封装和继承 我想知道实现IEnumerable是否可以算作如下所示的多态性 public class AddressBookEnumerator : IEnumerator { #region IEnumerable Implementation public Person[] Contacts; int Position =

所以我现在有一个通讯录程序(故意是基本的,因为我不想写更多的花哨的东西),所以正在做一个评估模块(这不是学校作业)

我必须在这个模块中演示多态性、封装和继承

我想知道实现IEnumerable是否可以算作如下所示的多态性

public class AddressBookEnumerator : IEnumerator
{
    #region IEnumerable Implementation
    public Person[] Contacts;
    int Position = -1;

    public AddressBookEnumerator(Person[] ContactList)
    {
        Contacts = ContactList;
    }

    public bool MoveNext()
    {
        Position++;
        return (Position < Contacts.Length);
    }

    public void Reset()
    {
        Position = -1;
    }

    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }

    public Person Current
    {
        get
        {
            try
            {
                return Contacts[Position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
    #endregion
}
公共类AddressBookEnumerator:IEnumerator
{
#区域可数实现
公众人士[]联系人;
int位置=-1;
公共地址簿枚举器(人员[]联系人列表)
{
联系人=联系人列表;
}
公共图书馆
{
位置++;
返回(位置<触点长度);
}
公共无效重置()
{
位置=-1;
}
对象IEnumerator.Current
{
得到
{
回流;
}
}
公众人士流动
{
得到
{
尝试
{
返回触点[位置];
}
捕获(IndexOutOfRangeException)
{
抛出新的InvalidOperationException();
}
}
}
#端区
}
我只是想知道这是否是因为继承了IEnumerator类,然后为我的特定类创建了具有不同行为的新方法?或者我只是误解了IEnumerator的工作原理。

是一个

允许不同数据值的编程语言功能 要使用统一接口处理的类型

在当前提供的代码中,我只看到一种数据类型

实现
IEnumerable
是关于订阅给定接口的契约,因此您的类型可能与该接口类似。一、 就个人而言,我不会像
polymorphics
example那样描述这段代码

是一个

允许不同数据值的编程语言功能 要使用统一接口处理的类型

在当前提供的代码中,我只看到一种数据类型


实现
IEnumerable
是关于订阅给定接口的契约,因此您的类型可能与该接口类似。一、 就个人而言,我不会像
polymorphics
example那样描述这段代码

我会尽快把它分解

interface IOrganism
{
    string GetSpecies();
}

abstract class Animal : IOrganism
{
    abstract string GetSpecies();
}

class Rat : Animal
{
   public virtual string GetSpecies()
   {
      return "Ratus";
   }
}

sealed class BlackRat : Rat
{
    public override string GetSpecies()
    {
       return string.Format("{0} Ratus", base.GetSpecies()));
    }
}
Animal
Rat
BlackRat
都是具有
IOrganism
的多态性
Rat
BlackRat
Animal
具有多态性。最后,
BlackRat
Rat
是多态的


这意味着,我可以写一个函数

void OutputSpecies(IOrganism organism)
{
    Console.WriteLine(organism.GetSpecies());
}
它可以接受
IOrganism
的任何实现者,无论是
Rat
BlackRat
还是未来的实现者,因为它们都是
IOrganism
的多态性


因此,为了回答最初的问题,实现一个接口,比如
IEnumerable
,并将其用作函数的参数就是使用多态性。然而,您的代码只是实现了
IEnumerator
,所以这是一种折衷。它显示了多态性的潜力,但在实践中没有多态性


此外,使用IEnumerator作为示例可能会分散您对所需任务的注意力,您最好让示例更抽象。

我将尝试快速分解它

interface IOrganism
{
    string GetSpecies();
}

abstract class Animal : IOrganism
{
    abstract string GetSpecies();
}

class Rat : Animal
{
   public virtual string GetSpecies()
   {
      return "Ratus";
   }
}

sealed class BlackRat : Rat
{
    public override string GetSpecies()
    {
       return string.Format("{0} Ratus", base.GetSpecies()));
    }
}
Animal
Rat
BlackRat
都是具有
IOrganism
的多态性
Rat
BlackRat
Animal
具有多态性。最后,
BlackRat
Rat
是多态的


这意味着,我可以写一个函数

void OutputSpecies(IOrganism organism)
{
    Console.WriteLine(organism.GetSpecies());
}
它可以接受
IOrganism
的任何实现者,无论是
Rat
BlackRat
还是未来的实现者,因为它们都是
IOrganism
的多态性


因此,为了回答最初的问题,实现一个接口,比如
IEnumerable
,并将其用作函数的参数就是使用多态性。然而,您的代码只是实现了
IEnumerator
,所以这是一种折衷。它显示了多态性的潜力,但在实践中没有多态性


<> P>另外,使用<代码> IEnumerator <代码>作为一个例子可能会分散你所期望的任务,你最好保持你的例子更抽象。

而你可以考虑将接口级别的类型看作多态性,对于更学术的方法,他们可能会沿着这类线思考更多?

我们看到:

  • 从抽象基类继承
    Employee
  • 当我们提到
    GetBonusMultiplier
    方法时,封装/多态性。我们能够从抽象基类中引用方法,并且我们也不知道每个类型如何确定基乘数的内部结构。我们所知道/关心的是,当我们调用该方法时,我们会得到一个int值
如果您想将Employee更改为界面
IEEmployee
,这将很简单。我可能仍然有一些抽象的基础来捕获公共字段,因此您不必在实现
IEmployee
的每个类中重新实现

class Program
{
    static void Main(string[] args)
    {
        var employees = new List<Employee>
        {
            new Manager(1, "Dave Smith"),
            new Director(2, "Peter Thompson")
        };

        foreach (Employee employee in employees)
        {
            Console.WriteLine(string.Format("Employee ID: {0}. Employee Name: {1}. Bonus Multiplier: {2}.", employee.Id, employee.Name, employee.GetBonusMultiplier()));
        }
        Console.ReadKey();
    }
}

abstract class Employee
{
    public int Id { get; protected set; }
    public string Name { get; protected set; }

    public abstract int GetBonusMultiplier();
}

class Director : Employee
{
    public Director(int employeeId, string name)
    {
        Id = employeeId;
        Name = name;
    }

    public override int GetBonusMultiplier()
    {
        return 3;
    }
}

class Manager : Employee
{
    public Manager(int employeeId, string name)
    {
        Id = employeeId;
        Name = name;
    }

    public override int GetBonusMultiplier()
    {
        return 2;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var员工=新名单
{
新任经理(1名,“戴夫·史密斯”),
新任董事(2名,“彼得·汤普森”)
};
foreach(员工中的员工)
{
WriteLine(string.Format(“员工ID:{0}。员工姓名:{1}。奖金乘数:{2}.”,Employee.ID,Employee.Name,Employee.GetBonusMultiplier());
}
Console.ReadKey();
}
}
抽象类雇员
{
public int Id{get;protected set;}
公共字符串名称{get;protected set;}
公共抽象int GetBonusMultiplier();
}
班主任:雇员