对不起,我的头衔不好,因为我真的不知道怎么说这个问题。我看到我的前辈使用选择1将继承的类转换为基础,然后将其转换为继承以使用继承类的函数。
为什么他们不做选择2之类的事情?只需将变量定义为派生类,不需要进行转换。
class question
{
static void Main()
{
#region Choice 1
baseclass whyusethis = new derivedclass();
(whyusethis as derivedclass).printbase();
(whyusethis as derivedclass).printderived();
#endregion
#region Choice 2
derivedclass shouldusethis = new derivedclass();
shouldusethis.printbase();
shouldusethis.printderived();
#endregion
Console.ReadLine();
}
}
答案 0 :(得分:2)
在普通继承方案中,始终分配给基类对象。您可以将派生类引用分配为"选择2"表示,但是只有在需要调用仅存在于派生类(而不是基类)中的函数时才应该这样做。
现在,如果你需要这样做,你应该质疑你的设计,因为派生类的用户应该通过基类定义的接口。
换句话说,如果类结构设置得恰当:
public class BasePrintClass
{
public void PrintBaseClass()
{
}
public abstract void PrintDerivedClass(); //Why these are seperated only you know
}
public class DerivedPrintClass
{
public override void PrintDerivedClass()
{
}
}
然后你只需使用基类,让多态处理派生类调用:
BasePrintClass print = new DerivedPrintClass();
print.PrintBaseClass();
print.PrintDerivedClass();
多态性是你的朋友,使用它! "选择1"是有效的,但不推荐,如果您使用上述方法则不需要。在"选择2"您通过分配派生类引用完全避免了多态性。这比铸造更好,但如果你正确设计它就没有必要了!
为了明确地回答这个问题,程序员必须转向基类,因为他们必须(需要一个只派生的函数)。任何其他时间都是糟糕设计的肯定标志(或者只是来自不了解多态性的人的错误代码)。需要派生功能绝对是可疑设计的标志,所以无论如何都可以随意询问它!
如果我能澄清任何事情,请告诉我。
答案 1 :(得分:1)
在您提供的代码中很难看出任何原因 - 您需要提供更多背景信息。如果baseclass
实际上是一个接口,那么这些方法可以显式实现接口的成员。它可能有一个原因,代码写入后,已经改变。
这段代码需要注意的一点是,演员的风格在这里并不恰当。它比正常演员要慢,如果出于某种原因,whyusethis
不是derivedclass
,那么您已经交换InvalidCastException
一个令人困惑的NullReferenceException
{1}}。