【发布时间】:2015-12-25 13:03:59
【问题描述】:
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]);
}
}
}
}
有没有更优雅的方法来做到这一点? 我原来的班级要大得多,所以复制它并不理想。
(请注意,此示例与我的项目无关,因此可能不是最好的示例。)
【问题讨论】:
-
这个问题可能更适合codereview.stackexchange.com。
-
我会将
LoadName更改为SetName。LoadName表示它将获取名称,因此返回一个字符串。 -
为什么不将带有 id 的 LoadName 包含到抽象类中并覆盖两者?
-
@sstan 本来可以,只是这似乎有点像样例。这个问题在 Code Review 中非常边缘化,很有可能被关闭,或者 OP 可能对 CR 上的答案不满意。如果您还没有这样做,我建议您阅读A Guide to Code Review for Stack Overflow users。
-
让我感到奇怪的是,您的人物对象一开始就没有“加载”。为什么不使用一个构造函数来获取 id 和 name 并立即进行创建和初始化,当您拥有输入数据并知道要创建什么类型时?这可能是基本类型的构造函数。如果您需要派生类型的更多(数据),请在派生类型中创建额外的构造函数并从中调用基构造函数。
标签: c# oop inheritance methods