C#accsess派生方法来自main ..

时间:2017-08-10 13:47:42

标签: c# inheritance polymorphism

"我尝试用两个课程编写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选项...

2 个答案:

答案 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()方法。