你这样写会让其他人乱用继承关系。
原PO的解答的确是要用多型,Abb大写的没错。
但是“如何写”是一回事,
你有用到DesignPattern的概念,写出来的东西却打了自己一巴掌。
====文字档====
文字档Father.txt
Father
My name is Darth Vader.
I am your Father!
文字档Son.txt
Son
My name is Luke Skywalker.
No~~~~~~~~~!
====程式码====
程式码Family.cs
abstract public class Family
{
public string StrA { get; set; }
public string StrB { get; set; }
public Family(StreamReader reader)
{
this.StrA = reader.ReadLine();
this.StrB = reader.ReadLine();
}
public abstract void ShowStrA();
public abstract void ShowStrB();
}
程式码Father.cs
public class Father : Family
{
public Father(StreamReader reader)
: base(reader)
{
}
public override void ShowStrA()
{
Console.WriteLine(this.StrA);
}
public override void ShowStrB()
{
Console.WriteLine(this.StrB);
}
}
程式码Son.cs
public class Son : Family
{
public Son(StreamReader reader)
: base(reader)
{
}
public override void ShowStrA()
{
Console.WriteLine(this.StrA);
}
public override void ShowStrB()
{
Console.WriteLine(this.StrB);
}
}
程式码FamilyFactory.cs
public class FamilyFactory
{
public static Family CreateFamily(string familyMember, StreamReader
reader)
{
if (familyMember == "Father")
{
return new Father(reader);
}
else if (familyMember == "Son")
{
return new Son(reader);
}
else
{
return null;
}
}
}
客户端调用
StreamReader reader1 = new StreamReader("Father.txt");
StreamReader reader2 = new StreamReader("Son.txt");
string familyMember1 = reader1.ReadLine();
string familyMember2 = reader2.ReadLine();
Family family1 = FamilyFactory.CreateFamily(familyMember1, reader1);
Family family2 = FamilyFactory.CreateFamily(familyMember2, reader2);
family1.ShowStrA();
family2.ShowStrA();
family1.ShowStrB();
family2.ShowStrB();
结果
My name is Darth Vader.
My name is Luke Skywalker.
I am your Father!
No~~~~~~~~~!
Father类别或Son类别是不同的,
只有新手或不熟悉物件导向的人才会直接用Son来继承Faher,
这两个类别都应该抽像于Family类别,
这样子写才比较好维护也有弹性。
Abb大说的多型是这样,
只不过我偷懒把strA跟strB的readline写在建构式。
※ 引述《adrianc (123)》之铭言:
: 看完后整整十分钟心神不宁无法继续工作,决定趁吃饭前回一下。
: 由原PO回文中已知两个类别是继承关系。
: 依照原文推文中的Abb大建议,实作程式码。
: // 以下程式码依原程式内容
: // 预期档案第一行可能读到 "father" or "son" 之外的内容,且不须处理
: // 变量命名使用原程式命名方式
: private void button1_Click(object sender, EventArgs e)
: {
: System.IO.StreamReader file = new System.IO.StreamReader("file.txt");
: string str = file.ReadLine();
: ClassFather xxx = null;
: if (str == "father)
: {
: xxx = new ClassFather();
: }
: else if (str == "son")
: {
: xxx = new ClassSon();
: }
: if (xxx != null)
: {
: xxx.strA = file.ReadLine();
: xxx.strB = file.ReadLine();
: }
: }
: