"我尝试用两个课程编写progrem,一个电话"门"和" AdvanceDoor" (派生类)现在AdvanceDoor有功能" ChangeCode" ,我尝试使用以下语法创建AdvanceDoor对象:
门广告=新的AdvanceDoor(必要的参数......);我无法看到她的方法(ChangeCode).."
class Program
{
static void Main(string[] args)
{
Door ad = new AdvanceDoor(222, 55, "Iron", "223");
// "here im try to call ChangeCode method from ad and its not exist"
Console.ReadLine();
}
}
现在如果我写:
AdvanceDoor d = new AdvanceDoor(222, 55, "Iron", "223");
这是工作...我的问题是为什么我不能使用基类创建对象然后如果我通过" new advanceDoor"它给了我advacneDoor选项...
答案 0 :(得分:0)
您正在尝试访问特定类的方法,但是当您创建AdvanceDoor的对象时,您将其分配给基类,因此您的实例无法使用ChangeCode方法。
正确的方法是 AdvanceDoor d = new AdvanceDoor(222,55,“Iron”,“223”);
或使用所有方法创建接口而不是基类。
答案 1 :(得分:0)
想要更深入地回答:
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"的函数。
好的,所以你有一个'门'变量 - 您无法调用当前的ChangeCode。但是可以检查该变量是否包含 具有该ChangeCode功能的实例 - 是否是“PasswordEncoded”的内容。
如果有的话?然后你可以把它作为一个PasswordEncoded对象(它就是 - 你之前检查过该行)并从那里调用ChangeCode()方法。