使用c#的基本对象引用和使用问题

New*_*667 2 c# oop object

我是面向对象和编程的新领域.还有一些我仍在努力理解的事情.

例如,我有以下代码:

 public abstract class ParentA
    {
        public virtual void MethodA()
        {
            Console.WriteLine("Doing somethin...");
        }
    }
    public class DerivedClassA : ParentA
    {
        public override void MethodA()
        {
            Console.WriteLine("Doing something from derived...");
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,我看到一些代码,其中类如下所示实例化:

ParentA p = new DerivedClassA();
            p.MethodA();
Run Code Online (Sandbox Code Playgroud)

为什么不只是实例化您想要使用的实际类并使用它的成员?

 DerivedClassA d = new DerivedClassA();
            d.MethodA();
Run Code Online (Sandbox Code Playgroud)

我看到这使用了很多接口,其中写的是这样的:

public interface Animal
    {
        void Bark();
    }
    public class Dog : Animal
    {
        public void Bark()
        {
            Console.WriteLine("bark");
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后以这种方式使用:

Animal a = new Dog();
            a.Bark();
Run Code Online (Sandbox Code Playgroud)

为什么不这样做??:

Dog d = new Dog();
            d.Bark();
Run Code Online (Sandbox Code Playgroud)

什么时候重要?

谢谢您的帮助

:)

Eri*_*ert 12

你是对的; 看起来很奇怪,不是吗?

代码:

Animal animal = new Dog();
Run Code Online (Sandbox Code Playgroud)

相当罕见; 通常,如果你知道你正在制作一只狗,那么你可以输入变量为Dog.更常见的是:

Animal animal = petStore.ObtainInexpensivePet();
Run Code Online (Sandbox Code Playgroud)

你不确切知道什么会回来的地方; 也许是一只小猫,也许是一只鬣蜥,但你知道它至少会成为一只动物.这是创建狗对象的宠物商店,而不是你.


SLa*_*aks 5

此技术可用于确保代码未耦合到特定实现.

如果此特定派生类具有其他方法(例如List<T>),并且您希望确保您的代码可以与其他没有这些额外方法的实现一起使用,则将该变量声明为基类型将确保您不会调用方法.