为什么有些程序员将继承的类转换为基类?

时间:2014-03-31 21:56:49

标签: c# casting derived

对不起,我的头衔不好,因为我真的不知道怎么说这个问题。我看到我的前辈使用选择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();

    }
}

2 个答案:

答案 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}}。