基类上的空虚拟方法VS抽象方法
我找不到一个对某种情况并不具体的问题,所以我会尝试使这个非常通用. 例如,我们需要一个提取器基类来集合一组文档.每个文档具有其特定属性,但最终是文档.因此,我们想为所有这些提供常见的提取操作. 即使它们都是文件,正如我所说,它们有些不同.有些可能有一些属性,但有些可能没有. 让我们想象我们有Document基本抽象类,以及从中继承的FancyDocument和NotSoFancyDocument类. FancyDocument具有SectionA,NotSoFancyDocument没有. 也就是说,您将为实施这一目标的最佳方式辩护吗?这是两个选项: 基类的空虚拟方法 基类上的空虚拟方法将允许程序员仅覆盖对不同类型文档有意义的方法.然后,我们将在抽象基类上具有默认行为,该类别将返回用于方法的default: : public abstract class Document { public virtual SectionA GetDoc
30 2024-04-26
编程技术问答社区
C# 抽象类
我必须创建一个伪造的DMV计划,用于计算商用和私人车辆的年费.这两个课程将是抽象的,它们将从名为所有车辆的班级中进行多聚生物学. 我的讲师只需要一个对象创建整个程序(主要),但是由于我的前3层类是抽象的.我无法使用它们创建一个对象,即车辆=新车辆(); 所以我的问题是如何仅创建一个对象,因为它们是抽象的?如果您有任何疑问可以问,我可能没有很好地解释这一点... 解决方案 您的类结构看起来像: abstract class Vehicle { protected abstract int BaseFee { get; } protected abstract int ExtraFee { get; } public int CalculateFee() { return BaseFee + ExtraFee; } } abstract class CommercialVehicle : Vehicle {
8 2024-04-25
编程技术问答社区
C# 用更具体的类型重写抽象属性
我有一个相当简单的问题,但是我在任何地方都找不到适当的解决方案.我想在我的抽象父母类中指定一个抽象对象自定义值为属性.但是,从中继承的类应该能够使用更具体的类型作为此属性CustomValues的对象.起初,我以为我会通过接口解决问题,但不幸的是,这也没有解决.您如何做这样的事情,它有效? public abstract class MyAbstract { public abstract object CustomValues { get; set; } } public class MyImplementation : MyAbstract { public override MySpecificClass CustomValues { get; set; } } 这会给我带来三个错误: 缺少getter的实施 缺少setter实施 类型object和MySpecificClass> 之间的错过 解决方案 评论中建议的解决方案看起来像这
8 2024-04-24
编程技术问答社区
.net框架中所有内置的抽象类是什么?
我一直在搜索,但找不到适当的列表.有人可以命名一些或gimme关于此的链接吗? 解决方案 此(快速且肮脏)的程序应为您提供一个列表,以从4.0开始; using System; using System.IO; using System.Reflection; class Program { static void Main(string[] args) { var assemblies = Directory.GetFiles("C:\\Windows\\Microsoft.NET\\Framework" + (Environment.Is64BitProcess ? "64" : "") + "\\v4.0.30319", "*.dll"); foreach(var assembly in assemblies) { try {
8 2024-04-23
编程技术问答社区
为什么我不能访问子类中的受保护变量?
我有一个带有保护变量的抽象类 abstract class Beverage { protected string description; } 我无法从子类访问它. IntelliSense无法显示它可访问.为什么这样? class Espresso:Beverage { //this.description ?? } 解决方案 简短答案:description是一种特殊类型的变量,称为" field ".您可能希望在字段上阅读 msdn . 长答案:您必须在子类的构造函数,方法,属性等中访问受保护的字段. class Subclass { // These are field declarations. You can't say things like 'this.description = "foobar";' here. string foo; // Here is a method. You c
12 2024-04-23
编程技术问答社区
继承具有抽象属性的抽象类
我有带有抽象属性的基类.我希望所有继承类都覆盖抽象属性.示例: public class Person { public string Name{get;set;} public string LastName{get;set;} } public class Employee : Person { public string WorkPhone{get;set;} } public abstract class MyBase { public abstract Person Someone {get;set;} } public class TestClass : MyBase { public override Employee Someone{get;set;} //this is not working } 基类具有Person类型的属性.我在TestClass上覆盖Someone属性.现在,我想使用Employee键入而不
6 2024-04-23
编程技术问答社区
为什么一个抽象类要实现一个抽象基类的抽象方法?
在下面的示例中,类Derived从类Main中实现了抽象方法method.但是我想不出一个理由在抽象Derived类的实现中填写方法主体.当然,我应该只在真实类中实现摘要方法. 那么我该如何避免这样做呢?我还可以做些什么? abstract class Main { public abstract void method(); } abstract class Derived : Main { public override void method() { } } class RealClass : Derived { } 解决方案 通常,如果某人指定抽象类具有抽象方法,则是因为该类取决于该方法的某些工作,或者是因为它是预期API的一部分,以至于它不会目前,父母班级实现很有意义.无论哪种情况,一旦您获得了类的非抽取实现,就必须实现. 还请注意,如果您正在实现接口,则必须说明如何实现该接口,即使您只是调用成员摘要并将责任传递到子
6 2024-04-22
编程技术问答社区
在C#中可以使用类的初始化器吗?
在c#中,您有对象初始化对象的字段现在,我想知道是否有等同的类,这意味着在不实际使用覆盖语法的情况下定义子类时可以"初始化"类的属性,而只是声明已知属性的值是什么. 示例: public abstract class Car { public abstract string Name { get; } } // usual approach public class Mustang : Car { public overwrite string Name { get { return "Ford Mustang"; } } } // my idea of avoiding boilerplate code public class Mustang : Car { Name = "Ford Mustang" } 有没有办法来实现这一目标?如果没有,T4模板可以有任何帮助吗? 解决方案 要使Rekire的示例更清晰,您会写下类似的内容: publ
4 2024-04-22
编程技术问答社区
抽象类和接口之间的区别是什么?
可能的重复: interface vs Abstract类(常规OO) 我可以实例化抽象类吗?如果是这样,为什么我不将所有非密封课程抽象化? 如果我不能实例化,那么接口有什么区别?抽象类可以具有"基础"类功能?界面和抽象类之间的区别比这更多吗? 解决方案 您无法实例化抽象类. 抽象类和接口之间的区别在于,抽象类可以具有方法的默认实现,因此,如果您不在派生类中覆盖它们,则使用抽象基类实现.接口无法实现任何实现. 其他解决方案 接口无法提供实现.您也可以实现多个接口. 您可以在抽象类内提供实现,但是您只能从一种基本类型继承. 无论哪种情况,您都不能直接实例化. 其他解决方案 您无法直接创建抽象类的实例.但是,您可以提供方法和/或属性实现,您无法在接口中执行.另外,您只能继承一个类别或其他其他类,而您可以根据需要继承(实现). abstract class A { public int Foo() { return 1;
4 2024-04-21
编程技术问答社区
抽象类和构造函数
作为一个抽象类,不能实例化,为什么在抽象类中仍然允许构造函数? public abstract class SomeClass { private string _label; public SomeClass(string label) { _label=label; } } 解决方案 任何派生类的构造函数仍然必须在抽象类中调用构造函数.如果您根本不指定任何构造函数,则所有派生的类都必须使用编译器提供的默认无参数. 拥有构造函数绝对有意义 - 但是在这种情况下,"公共"确实等同于"受保护". 其他解决方案 ,因为您仍然可以执行以下操作: public class SomeChildClass : SomeClass { public SomeChildClass(string label) : base(label){ } public string Get
10 2024-04-21
编程技术问答社区
在DataTemplates中使用抽象类作为数据类型
我已经遇到了有关C#中的抽象类和数据截图的其他Stackoverflow问题,但是我不知何故无法正常工作. 代码看起来像这样: public abstract class AbstractParser() { public string Name { get; set; } } public class ConcreteParser() : AbstractParser { } 现在,我想使用摘要类创建一个datatemplate(对于ListBox,包含ConcreteParser>的元素. 但是,我没有在DataTemplate中使用它.基于其他帖子(例如 wpf databinding实际对象 - 可能施放?),这应该是可能的: 提出一个具体问题: 如果我想为包含许多不同具体类的对象创建一个模板,这些模板都是从一个常见的抽象基
4 2024-04-21
编程技术问答社区
Entity Framework 4抽象模型-如何以编程方式急于加载导航属性?
我有一个由抽象实体/类构建的EF4模型: 注意状态实体如何具有称为 country>的导航属性. 注意:我禁用了懒惰的负载,因此我必须按需急切地加载. 现在,如果我有以下方法: public Location FindSingle(int id) { return _repository.Find().WithId(id).SingleOrDefault(); } 默认情况下,这不会返回任何关联.但是,当我明确想要时,如何动态急切地加载关联? 我不能这样做: return _repository.Find().WithId(id).Include("Country").SingleOrDefault(); 我正在使用称为位置的抽象类时,该类别没有名为"乡村"的导航属性.我不知道 在我实际执行.SingleOrDefault> 实际执行查询之前是什么是什么. 所以,这是我必须做的: public Location FindSi
10 2024-04-21
编程技术问答社区
抽象类设计。为什么不定义公共构造物?
在这里查看(抽象类设计): http://msdn.microsoft. com/en-us/library/ms229047.aspx 它说: (1)在抽象类型中不要定义公共或受保护的内部(视觉基本)构造函数. 在C#中,我们无法实例化抽象类.那么,定义C#中抽象类的公共构造函数仍然很重要吗?还是由于语义含义为抽象类编写公共构造函数? 它还说: (2)在抽象类中定义一个受保护或内部构造函数. 定义内部构造函数?在(1)中,它告诉我们,没有定义内部受保护的构造函数,是因为"具有公共或受保护的内部可见性的构造函数是可以实例化的类型".为抽象类定义内部构造函数是否打破了(1)中的规则? 预先感谢. :) 解决方案 让我们看一下每种情况. 推荐: 受保护的 - 最明显的情况 - 所有子类都可以称为构造函数,而构建器构成构建器,否则它们驻留在哪个组件中(只要抽象的基础级本身对他们来说是可见的). 内部 - 当您希望抽象类型公开可
6 2024-04-21
编程技术问答社区
属性、接口、或抽象类
我想知道以下实现的一般建议是什么(属性,接口,抽象类或组合): /// /// Loads class specific information into a list for serialization. The class must extend PlugIn. /// The filenames parameter is passed from a FileDialog. /// /// Accepts any number of filenames with fully qualified paths. public static void ExtractPlugInData(params string[] filenames) { List l; foreach (string
6 2024-04-21
编程技术问答社区
在C#中,抽象类和接口类之间有什么不同?
c#? 中的摘要和接口类之间有什么不同 解决方案 接口不是类,只是合同定义了 public class 必须实施. 抽象类只是您无法创建实例的类.通常,您会使用它来定义一个基类,该基类定义某些虚拟用于实现的 derived 类的方法. 其他解决方案 而不是在这里写整个东西. 尝试 其他解决方案 类可以实现多个接口,但只能从一个抽象类继承. 抽象类可以为其方法提供实现.接口无法提供实现.
16 2024-04-21
编程技术问答社区
你能在一个实际的例子中帮助我理解抽象类与接口的用法吗?
您能否给我对抽象类与继承使用和帮助我的几乎过于简单的理解,以便我可以真正理解该概念以及如何实施?我有一个正在尝试完成的项目,并且对如何实施感到迷失.我一直在和我的教授聊天,并被告知很多,说如果我不知道,我可能还没有准备好这门课程.我已经过度编写了前准则课程,并且仍然难以理解这些概念. 澄清,到目前为止我所做的项目都在下面.我还没有狗/猫课等.你能给我一个指针吗?我不是要任何人给我"答案".我只是迷失在去哪里.我参加在线课程,他与我的沟通工作令人不安.我刚刚完成了所有其他课程的4.0,所以我愿意付出努力,但是我在理解这些概念以及如何实际应用它们的理解中迷失了方向. 有任何评论或帮助,可以让我在这个项目中进步? 我要实现的描述如下: 概述: 本练习的目的是 演示使用接口, 继承,抽象类和 多态性.您的任务是 提供的程序外壳,添加 适当的课程和相应的课程 班级成员/方法 程序以正常运行.您可以 不更改任何代码 提供的,您只能添加课程 你写.虽然有 获取程序的许多方
14 2024-04-20
编程技术问答社区
AutoMapper。将接口映射到抽象类--这可能吗?
我正在使用 automapper 在我应用程序的不同层之间映射对象. 在一侧,我有一个看起来像这样的界面: public interface MyRepo { IEnumerable GetItems(param); } iRootObject看起来像这样: public interface IRootObject { int Id { get; set; } DateTime? Date { get; set; } } public interface IFirstSubObject : IRootObject { string MyFirstProp { get; set; } } public interface ISecondSubObject : IRootObject { string MySecondProp { get; set; } } 因此,GetItems()呼叫实际上仅
22 2024-04-20
编程技术问答社区
处理从抽象类和类型参数中继承的类
我有一个基本抽象类及其抽象类型参数为: public abstract class Database where T : DatabaseItem, new() { protected List _items = new List (); protected virtual void Read (string[] cols) { T item = new T (); ... } public abstract class DatabaseItem { ... } 然后我有来自它固有的儿童课程: public class ShopDatabase : Database {} public class ShopItem : DatabaseItem {} public class WeaponDatabase : Database {} public class WeaponIt
8 2024-04-20
编程技术问答社区
如果没有抽象的成员,基类是否应该被标记为抽象的?
如果没有抽象成员,则可以将班级标记为抽象吗?即使没有实际理由直接实例化? (除了单位测试) 解决方案 是的,明确标记为抽象的基类是不应实例化的 - 即使在没有抽象方法的情况下也是合理且有益的. 它执行了使非叶级课程摘要的通用准则. 它可以防止其他程序员创建类实例.这可能会使您更容易在以后添加抽象方法. 其他解决方案 您是否希望该课程有一个实际实例?如果是,请不要将其标记为抽象.如果否,然后将其标记为抽象. 其他解决方案 简短答案:是. 长答案:abstract关键字将类和/或其成员标记为直接有用.为什么情况可能会因情况而异;一个摘要类可能是基本的,无法从事任何实际工作,或者它可能具有该类中其他代码需要存在的摘要成员,但不能在此级别上具体定义.简而言之,您可以告诉编译器和其他开发人员不要直接实例化此类,而是从中继承来创建具体的实现实现.即使班级对其所有成员都有工作实施,您也可以执行此操作,如果您认为必须继承班级才能充分利用该实施.
4 2024-04-20
编程技术问答社区