C# 实践中的多态性#
所以我现在有一个通讯录程序(故意是基本的,因为我不想写更多的花哨的东西),所以正在做一个评估模块(这不是学校作业) 我必须在这个模块中演示多态性、封装和继承 我想知道实现IEnumerable是否可以算作如下所示的多态性C# 实践中的多态性#,c#,polymorphism,C#,Polymorphism,所以我现在有一个通讯录程序(故意是基本的,因为我不想写更多的花哨的东西),所以正在做一个评估模块(这不是学校作业) 我必须在这个模块中演示多态性、封装和继承 我想知道实现IEnumerable是否可以算作如下所示的多态性 public class AddressBookEnumerator : IEnumerator { #region IEnumerable Implementation public Person[] Contacts; int Position =
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
- 当我们提到
方法时,封装/多态性。我们能够从抽象基类中引用方法,并且我们也不知道每个类型如何确定基乘数的内部结构。我们所知道/关心的是,当我们调用该方法时,我们会得到一个int值GetBonusMultiplier
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();
}
班主任:雇员