您能帮助我在实际示例中理解抽象类与接口的用法吗?

2024-03-18

您能否让我对抽象类与继承的使用有一个几乎过于简单化的理解,并帮助我,以便我能够真正理解这个概念以及如何实现?我有一个想要完成的项目,但不知道如何实施。我一直在和我的教授聊天,他经常责备我,说如果我无法弄清楚,我可能还没有准备好学习这门课程。我已经完成了先决条件课程,但仍然难以理解这些概念。

为了澄清这一点,我到目前为止所做的项目如下。我还没有填写狗/猫课程等。能给我指点一下吗?我不要求任何人给我“答案”。我只是不知道该去哪里。我参加在线课程,他与我的沟通努力一直令人不安。我刚刚完成了 4.0 和所有其他课程,所以我愿意付出努力,但我迷失在对这些概念的理解以及如何实际应用它们上。

有什么意见或帮助可以让我在这个项目上取得进一步的进展吗?

我要实现的内容的描述如下:

概述:

这项练习的目的是 演示接口的使用, 继承、抽象类和 多态性。你的任务是采取 提供的程序外壳并添加 适当的类别和相应的 类成员/方法来获取它 程序才能正确运行。您可以 不对任何代码进行更改 提供,您只能添加类 你写。虽然有 获取该程序的多种方式 工作时,您必须使用以下技术 演示接口的使用,
继承、抽象类和 多态性。再次澄清, 您可以添加到提供的代码,但是 您不能更改或删除任何 它。提供的代码将 只需很少的额外代码 并将满足以下要求 练习。

如果您成功完成 作业,你的程序应该输出 运行时出现以下语句:

我的名字是 Spot,我是一只狗

我的名字是菲利克斯,我是一只猫

要求:

1)你必须有一个抽象的基础 名为“Animal”的类,其中 Dog 和 Cat 类派生。

2)Animal基类必须派生 从接口“IAnimal”来看,它是 唯一应该派生自的类 我动物。

3) 因为所有动物都有名字和 name 不是一个属性 特定于狗或猫,动物

基类应该是名称所在的位置 WhatIsMyName 的存储位置 get-property 已实现。

4)你需要创建一只狗和一个 Cat 类只能派生自 动物基类。

5) Dog 和 Cat 类应该 实现 WhatAmI get-property 和 返回适当的字符串值。

您无法更改的代码:

using System;

namespace IT274_U2
{
    public interface IAnimal
    {
        string WhatAmI { get; }
        string WhatIsMyName { get; }
    }

    public class TesterClass
    {
        public static void DescribeAnimal(IAnimal animal)
        {
            Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
        }

        static void Main(string[] args)
        {
            Dog mydog = new Dog("Spot");
            Cat mycat = new Cat("Felix");
            DescribeAnimal(mydog);
            DescribeAnimal(mycat);
        }
    }
}

//////////////////////////////////////////////

到目前为止我写的代码:

using System;


namespace IT274_U2
{
    public interface IAnimal
    {
        string WhatAmI { get; }
        string WhatIsMyName { get; }
    }


    public class Dog
    {
        public abstract string WhatAmI
        {
            get;
            set;
        }
    }//end public class Dog

    public class Cat
    {
    public abstract string WhatIsMyName  
    {
        get;
        set;
    }
    }//end public class Cat

    public abstract class Animal : IAnimal
    {
    // fields
    protected string Dog;
    protected string Cat;

                  // implement WhatIsMyName 

    //properties
    public abstract String Dog
    {
        get;  
        set;
    }
    public abstract String Cat
    {
        get;
        set;
    }
    public abstract string WhatIsMyName();

    } //end public abstract class Animal


    public class TesterClass
    {
        public static void DescribeAnimal(IAnimal animal)
        {
            Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
        }

        static void Main(string[] args)
        {

            Dog mydog = new Dog("Spot");
            Cat mycat = new Cat("Felix");
            DescribeAnimal(mydog);
            DescribeAnimal(mycat);
        }
    }
}

EDIT:

我已经取出了每个类的代码主体 - 如果您想查看我的答案,请查看编辑修订版:)

首先我们定义界面 http://msdn.microsoft.com/en-us/library/ms173156.aspx

public interface IAnimal
{
    string WhatAmI { get; }
    string WhatIsMyName { get; }
}

任何实现此接口的类都必须实现这些属性。接口就像一个契约;实现接口的类同意提供接口的方法、属性事件或索引器的实现。

接下来,我们需要定义您的抽象 Animal 类

public abstract class Animal : IAnimal
{
    //Removed for Training, See Edit for the code
}

事实上,该类是abstract http://msdn.microsoft.com/en-us/library/sf985hc5(VS.71).aspx指示该类仅作为其他类的基类。我们已经实现了接口的两个属性,并且还有一个私有字段来存储动物名称。此外,我们还做了WhatAmI属性访问器抽象,以便我们可以在每个派生类中实现我们自己的特定属性访问器逻辑,并且还定义了一个接受字符串参数并将值分配给_name私人领域。

现在,让我们定义我们的Cat and Dog classes

public class Dog : Animal
{
    //Removed for Training, See Edit for the code
}

public class Cat : Animal
{
    //Removed for Training, See Edit for the code
}

这两个类都继承自Animal每个都有一个构造函数,它定义一个字符串参数并将该参数作为参数传递给基本构造函数。此外,每个类都实现了自己的属性访问器WhatAmI,分别返回其类型的字符串。

对于其余的代码

public class Program
{
    public static void DescribeAnimal(IAnimal animal)
    {
        Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
    }

    static void Main(string[] args)
    {
        Dog mydog = new Dog("Spot");
        Cat mycat = new Cat("Felix");
        DescribeAnimal(mydog);
        DescribeAnimal(mycat);
        Console.ReadKey();
    }
}

静态方法DescribeAnimal接受一个IAnimal作为参数并写出返回的值WhatIsMyName and WhatAmI传入的属性访问器IAnimal.

Since Animal实施IAnimal以及两者Dog and Cat继承自Animal, any Cat or Dog对象可以作为参数传递给DescribeAnimal method.

我希望我已经清楚地解释了这一点,如果有人觉得我的措辞需要收紧,请发表评论,我将很乐意编辑我的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您能帮助我在实际示例中理解抽象类与接口的用法吗? 的相关文章

  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐