谁是谁或从扩展类创建对象

时间:2013-09-03 19:11:08

标签: c# oop

尝试理解OOP的所有力量

创建3个类

class A
{
     public string Foo()
    {
        return "A";
    }
}

class B:A
{

    public string Foo1()
    {
        return "a";
    }
}

class Program
{
   static void Main(string[] args)
    {
        A a = new B(); //can use method just from a
        B b = new B(); //both
        A aa = new A(); //just from a
        string result = b.Foo();
        string n = ((A)b).Foo().ToString();
    }
}

目前试图了解A a = new B()之间的区别;和A a =新的A(); - 尝试使用它 - 可以使用类中的相同方法 - 参见图片

enter image description here

也试着了解beetwen

的区别
B b = new B();
((A)b).Foo();

A a = new B(); 
b.Foo();

A a =(А) new B(); and A a = new A();

同时尝试找到有关OOP主要原理解释的好教程,但仍有一些问题。 感谢大家的理解

3 个答案:

答案 0 :(得分:4)

最简单的区别是:

A a = new B();
B b = (B) a;  // works!
A a = new A();
B b = (B) a;  // compiler error

即使您将B实例分配到A - 类型变量,它仍然是B类的实例,因此您可以将其强制转换回B

但这只是一个简单的例子。当您的班级有virtual个方法

时会出现真正的差异
class A
{
    public virtual void Foo()
    {
        Console.WriteLine("A : Foo();");
    }
}

override n

class B : A
{
    public override void Foo()
    {
        Console.WriteLine("B : Foo();");
    }
}

和/或隐藏:

class C : A
{
    public new void Foo()
    {
        Console.WriteLine("C : Foo();");
    }
}

在派生类中。使用该类声明,您将获得以下结果:

{
    A a = new A();
    B b = new B();
    C c = new C();

    a.Foo();  // prints A : Foo();
    b.Foo();  // prints B : Foo();
    c.Foo();  // prints C : Foo();
}

{
    A a = new A();  // prints A : Foo();
    A b = new B();  // prints B : Foo();
    A c = new C();  // prints A : Foo();

    a.Foo();
    b.Foo();
    c.Foo();
}

那更有趣,不是吗?您应该阅读有关overriding and hiding methods和类继承的更多信息。

答案 1 :(得分:3)

A a = new A();

创建A的新实例并将其保存在A变量中。您可以访问A

的所有方法和属性
A b = new B();

创建B的新实例并将其保存在A变量中。您只能访问由A公开的任何方法或属性。

区别在于......

B c = (B) b;

此行仅在var b最初实例化为B或子类时才有效。否则,它将抛出异常

答案 2 :(得分:3)

Class B is extending from Class A,

所以 B - IS A - > A

        A a = new B(); // B IS A --> A, has a reference of A but object of B,
                       // hence can use method just from a
        B b = new B(); // B is an instance of B which is an A, hence both
        A aa = new A(); // A is a super class here, subclass instance cannot access 
                        // so just from a

希望这有帮助。