尝试理解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(); - 尝试使用它 - 可以使用类中的相同方法 - 参见图片
也试着了解beetwen
的区别B b = new B();
((A)b).Foo();
和
A a = new B();
b.Foo();
和
A a =(А) new B(); and A a = new A();
同时尝试找到有关OOP主要原理解释的好教程,但仍有一些问题。 感谢大家的理解
答案 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
希望这有帮助。