从继承类调用方法
本文关键字:方法 调用 继承 | 更新日期: 2023-09-27 18:28:12
abstract class Person
{
public abstract void LoadName(string name);
}
class Soldier : Person
{
string soldierName;
int ID;
public override void LoadName(string name)
{
soldierName = name;
}
public void LoadName(int id)
{
ID = id;
}
}
class PersonManager
{
public void LoadNames(Person[] person, string[] names, int[] id)
{
for(int i = 0; i < p.Length; i++)
{
person[i].LoadName(names[i]);
if(person[i] is Soldier)
{
/* What I want to do:
person.LoadName(id[someValue]);
-> Cannot convert from 'string' to 'int'
or:
(Soldier)person.LoadName(id[someValue]);
-> Only assignment, call, increment, decrement and new object expressions can be used as a statement
*/
// What I have to do:
Soldier s = (Soldier)person[i];
s.LoadName(id[someValue]);
}
}
}
}
有没有更优雅的方法可以做到这一点?我原来的班级要大得多,所以复制它并不理想。
(请注意,此示例与我的项目无关,因此它可能不是最佳示例。
你可以
说:
((Soldier)person[i]).LoadName(id[someValue]);
这还不错。这里的问题是这个人没有LoadName(int)
当然,在父类中创建抽象重载可以解决此问题,但我假设您不想这样做。因此,LoadName(int)
是Soldier
类独有的,这是获得它的唯一方法。
另一种简化设计并使代码更自然的方法是将重载添加到Person
抽象类本身。这迫使任何继承类为 LoadName(int id( 提供实现,我认为它是健康的,因为 id 更适合标识实体。
abstract class Person
{
public abstract void LoadName(string name);
public abstract void LoadName(int id);
}
class Soldier : Person
{
string soldierName;
int ID;
public override void LoadName(string name)
{
soldierName = name;
}
public override void LoadName(int id)
{
ID = id;
}
}
class PersonManager
{
public void LoadNames(Person[] person, string[] names, int[] id)
{
for (int i = 0; i < person.Length; i++)
{
person[i].LoadName(names[i]);
person[i].LoadName(id[i]);
}
}
}
这是一种方法
abstract class Person
{
public abstract void LoadName(string name);
}
class Soldier : Person
{
public string soldierName { get; set; }
public int ID { get; set; }
public override void LoadName(string name)
{
soldierName = name;
}
public void LoadName(int id)
{
ID = id;
}
}
class PersonManager
{
public void LoadNames(Person[] person, string[] names, int[] id)
{
for (int i = 0; i < p.Length; i++)
{
person[i].LoadName(names[i]);
if (person[i] is Soldier)
{
Person newPerson = new Soldier() { soldierName = names[i], ID = id[i] };
}
}
}
}
或者这个
abstract class Person
{
public abstract void LoadName(string name, int id);
}
class Soldier : Person
{
public string soldierName { get; set; }
public int ID { get; set; }
public override void LoadName(string name, int id)
{
soldierName = name;
ID = id;
}
}
class PersonManager
{
public void LoadNames(Person[] person, string[] names, int[] id)
{
for (int i = 0; i < p.Length; i++)
{
if (person[i] is Soldier)
{
person[i].LoadName(names[i], id[i]);
}
}
}
}