C#accsess从主..派生方法。。

C#accsess从主..派生方法。。,c#,inheritance,polymorphism,C#,Inheritance,Polymorphism,“我尝试使用两个类编写progrem,一个调用“Door”和“AdvanceDoor”(派生类)现在AdvanceDoor具有函数“ChangeCode”,我尝试使用以下语法创建AdvanceDoor对象: 门广告=新进阶门(所需参数…;我看不到她的方法(变更码)…” 现在如果我写: AdvanceDoor d = new AdvanceDoor(222, 55, "Iron", "223"); 这是我的工作。。。我的问题是为什么我不能使用基类创建对象,如果我通过了“new AdvancedD

“我尝试使用两个类编写progrem,一个调用“Door”和“AdvanceDoor”(派生类)现在AdvanceDoor具有函数“ChangeCode”,我尝试使用以下语法创建AdvanceDoor对象:

门广告=新进阶门(所需参数…;我看不到她的方法(变更码)…”

现在如果我写:

AdvanceDoor d = new AdvanceDoor(222, 55, "Iron", "223");
这是我的工作。。。我的问题是为什么我不能使用基类创建对象,如果我通过了“new AdvancedDoor”,它会给我AdvancedDoor选项


您试图访问特定类的方法,但当您创建AdvanceDoor的对象或将其分配给基类时,ChangeCode方法对您的实例不可用

正确的做法是 进阶门d=新进阶门(222,55,“铁”,“223”)


或者用所有方法创建接口而不是基类。

想更深入地回答:

MyBaseClass bob = new SubClass();
bob.OnlyBaseClassMethods();
。。。原因是变量bob只能确定为MyBaseClass。如果有帮助,想象一下:

MyBaseClass bob;
if (something)
    bob = new SubClass();
else
    bob = new SecondSubClass();
bob.OnlyBaseClassMethods();
。。。此时,bob可能是这些子类中的任何一个

那么你是不是因为你想做的事情而运气不佳

视情况而定。请看下面的代码:

public class Door
{
    public void Open() { /* ... code ... */ }
    public void Close() { /* ... code ... */ }
}
public interface PasswordEncoded
{
    void ChangeCode();
}
public class AdvancedDoor : Door, PasswordEncoded
{
    public void ChangeCode() { /* ... code ... */ }
}

// ... elsewhere

public void SomeFunction(Door someDoor)
{
    if (someDoor is PasswordEncoded)
        ((PasswordEncoded)someDoor).ChangeCode();
}
这是怎么回事?我添加了一个名为“PasswordEncoded”的接口。如果您编写一个实现此接口的类,它将具有一个名为“ChangeCode”的函数

好的,所以您有一个“Door”变量-您不能按当前状态调用ChangeCode。但是,您可以检查该变量是否包含一个具有ChangeCode函数的实例——它是否是经过密码编码的


如果是的话?然后,您可以将其转换为PasswordEncoded对象(它是-您刚才检查了这一行),并从那里调用ChangeCode()方法。

因为变量
ad
的类型为
Door
。而且
Door
没有
ChangeCode
方法。您只能与正在使用的类型上存在的内容进行交互。您可以将该方法添加到父类,您可以将派生类型用于变量,您可以将变量强制转换为派生类型,等等。但问题的根源在于您的设计被破坏,您需要更好地理解和建模您想要使用的对象。编译器应该如何知道运行时
ad
中存储了哪种
Door
?也许你会有一个
NotSoAdvancedDoor
,没有
ChangeCode
,你将它存储在
ad
中。C#是一种类型安全性很高的语言。因此,如果你说它是一个
,它只是一个
,而不是
高级门
。是的,但是当我声明基,然后声明子类时,它应该识别它是一个子类类型,不是吗?@ShlomiTubul:内存中的对象可能是
高级门
,但变量的类型为
Door
。他们是两个不同的东西。@David好的,谢谢你!!!我不了解界面。。。你可以简单地向我解释一下他是干什么的?有时会用到“合同”这个词,但我喜欢“描述符”这个词。基本上,您可以确定一个或多个类将需要的一些功能,然后为该功能编写一个接口。之后,您可以让那些适当的类实现该接口(如我的示例中所示)。很难在注释中添加更多细节,但这个概念对于编写好的长期代码非常重要-您应该通过谷歌搜索来研究:“抽象类”、“接口”和“依赖项反转原则”了解更多的背景资料。
public class Door
{
    public void Open() { /* ... code ... */ }
    public void Close() { /* ... code ... */ }
}
public interface PasswordEncoded
{
    void ChangeCode();
}
public class AdvancedDoor : Door, PasswordEncoded
{
    public void ChangeCode() { /* ... code ... */ }
}

// ... elsewhere

public void SomeFunction(Door someDoor)
{
    if (someDoor is PasswordEncoded)
        ((PasswordEncoded)someDoor).ChangeCode();
}