Re: [问题] 变量宣告在if结构里

楼主: StupidGaGa (笨嘎嘎)   2014-05-19 14:14:22
你这样写会让其他人乱用继承关系。
原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();
: }
: }
:
作者: adrianc (123)   2014-05-19 14:48:00
你要不要看一下原po回文的 IamFunction 方法签名再想想为什么这样写? 这样看不懂我也不解释了另外 这边的抽象物件 (Father也好 Family也好)认识 StreamReader 本身就是..嗯..所谓的"新手"写法了..基本上 这个案例根本牵扯不上 DesignPattern 所以我还特别在原范例中跳过 Factory 以免模糊焦点我还真闲... 1. 不知道你是不是看出原po"已经"继承类别了2. 如果用偷懒解释的话 那所有的 dirty code 都是合理的我们也不需要再往下讨论了3. 我不知道 "son is father" 成不成立 至少已知资讯中没有超能力是看不出来的 我只能从物件行为判断4. 物件导向设计原则中 只有依赖倒转原则但没有一条告诉你 "类别不该继续于类别"需要从framework找些 "类别继承类别的"例子给您吗?5. again "我写的范例"中 没有包括 son 继承 father真的要说 了不起是"偷懒" 延用了既有类别最后 用抽象隔离实作是个好的习惯 但不代表永远可以拿一句话就说别人写错 (更何况这句话本身就有问题)不然 你直接批我变量用 xxx strA 会不会比较快?话说大哥 你看到 IamFunction 的签名了没?你是没看到还是真的看不懂?那个签名已经知道他的 son 有继承 father 了....还是看不懂签名? signature?你不觉得msdn有错 却觉得这里的Son继承Father 有错 理由?不要问这么大的好了 这里的son和father各是什么类别你知道吗? 我不清楚 因为就我看到的内容为限 只看到属性所以 以内容为限 son继承father 可能有错 也可能没错所以在没有更多已知的情况下 我觉得你的指教很无厘头上面写的5刚好被你的补充切成两段"我写的"范例中不包括继承 但我有延用"既有的"类别也就是说 这是一段不改变类别设计为前提的范例不改变设计的原因是 以目前看到的内容为限没办法判断 son和father 的继承关系是不是合理言归正传 原PO的问题是要避免重复程式码结果改完后在 if 和 else 中都出现了都样的呼叫既然都已经继承了 所以我单纯写出一点修正来避开这个问题完全看不出你回一篇文在激动什么 DesignPattern 的 = =如果你还是觉得这个例子中是错的 麻烦帮我把son/father换成label/control, strA/strB换name/text再帮忙写个信问MS 为什么Label可以继承非抽象类别Control
作者: ssccg (23)   2014-05-19 17:22:00
先不管son father这些名称,为什么类别不应该继承类别?
作者: GoalBased (Artificail Intelligence)   2014-05-19 18:14:00
纯推讨论@@
作者: hoyunxian (WildDagger)   2014-05-19 21:36:00
话说使用接口和继承基底类别到底差在哪?
作者: GoalBased (Artificail Intelligence)   2014-05-19 21:39:00
偶合性强弱的差别吧 楼上
作者: drizzt123 (drizzt)   2014-05-20 00:41:00
类别继承类别没有问题吧,随便建一个winform方案,都是form1:form 在"深入浅出C#"中举例,蜜蜂有工蜂(CLASS),"接口与防止重复程式码无关,而是跟让一个类别可以应用在多种情况有关。
作者: GoalBased (Artificail Intelligence)   2014-05-20 12:59:00
这叫做工程师的浪漫
楼主: StupidGaGa (笨嘎嘎)   2014-05-20 13:32:00
巨大机器人(变形金刚)与巨大怪兽(哥吉拉)是男人的浪漫
作者: ssccg (23)   2014-05-21 09:12:00
IntegerTextBox : FormattedTextBox : TextBox : Control例你Form那个例子,你觉得这是坏继承?要继承就是要省掉同样的部分,为什么还要特地从基底继承?你说有几个情况才能打破的 2 is的关系继承本来大多数就是因为is的关系才继承,怎么变例外了?
作者: KanoLoa (卡)   2014-05-23 00:13:00
观念很好很棒,但是拿原PO的例子根本矫枉过正...

Links booklink

Contact Us: admin [ a t ] ucptt.com