Tag: 抽象类

在通用c#类中链接隐式运算符

对于以下通用c#类,我想将T转换为K: public abstract class ValueType : IValueType where K : ValueType,new() { public abstract T Value { get; set; } public static implicit operator ValueType(T val) { K k = new K(); k.Value = val; return k; } } 如果我要实现直接运算符implicit operator K(T val) ,则会导致编译时错误(CS0556)。 我以为我可以尝试链接隐式运算符: public static implicit operator K(ValueType vt){ return (K)val; } 但是下面的例子仍然抱怨它无法转换: […]

多个派生抽象类?

我必须创建一个课程管理系统,其中包括课程类别: Cooking, sewing and writing courses cooking和writing每个都有2道菜(意大利,海鲜,创意写作和商业写作)。 这会创建派生的抽象: abstract course -> abstract cooking -> concrete seafood 抽象的烹饪和写作有共同的领域和一些常用的方法,但是它们也有抽象的方法在基类中是抽象的。 这可以在C#中完成吗? 如果我使派生的抽象类方法抽象Visual Studio说他们隐藏基类抽象然后具体的类方法有错误说基类必须是抽象的(它必须但不能注册)。 我找了答案。 我知道单inheritance在C#中使用,但inheritance带有链。 什么是最好的答案? 这是一个代码片段 – 我希望它澄清了问题: public abstract class Course { public abstract void AddStudent(StudentName sn, int f); public abstract decimal CalculateIncome(); } public abstract class WritingCourse : Course { public void AddStudent(StudentName sn, int […]

抽象类不能用c#封装?

我在某处读到了 “抽象和密封修饰符相当于一个静态的类” 我也发现了 “当你声明一个静态类时,编译器在内部标记类抽象并密封,并在IL代码中创建一个私有构造函数” 所以,我决定这样做: static class A { public static void test() { Console.WriteLine(“test”); } } 现在,类“A”不能被inheritance或实例化。 因此,让我们使用abstract编写一个class B来防止实例化并使用sealed来防止inheritance。 但是,这种方法失败了。 这相当于 public abstract sealed class B { private B() { } public void test() { Console.WriteLine(“test”); } } But I recieve an error stating “error CS0418: B’:抽象类不能被密封或静态”。 任何想法为什么这是不可能的? 提前感谢您的回答。

处理抽象类和类型参数固有的类

我有一个基本抽象类及其抽象类型参数: 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 […]

接口/抽象类编码标准

我发现了一个提议的C#编码标准,其中说“尝试提供一个包含所有抽象类的接口”。 有人知道这个的理由吗?

在C#中是否有任何方法可以在派生类中强制执行运算符重载?

我需要定义一个接口,它必须强制执行某些运算符重载到实现它的类型。 似乎没有一种明显的方法可以做到这一点,因为运算符重载必须在类中使用静态方法完成。 有没有办法达到相同的效果(使用抽象类或其他任何东西)?

为什么接口不起作用,而抽象类却使用generics类约束?

下面的代码显示了一个带有类型约束的通用类( Pub )。 该类有一个可以引发的事件,允许我们向订阅者传递消息。 约束是消息必须实现IMsg (或者当它是抽象类时从IMsginheritance)。 Pub还提供了一个Subscribe方法,当且仅当对象实现了IHandler ,才允许对象订阅notify事件。 使用.NET 4,下面的代码显示baseImplementer.NotifyEventHandler上的错误,指出: “No overload for ‘IHandler.NotifyEventHandler(IMsg)’ matches delegate ‘System.Action'” 问题:(使用更新的订阅方法) 一旦我将`IMsg`更改为抽象类而不是接口,为什么错误会消失? public interface IMsg { } // Doesn’t work //public abstract class IMsg { } // Does work public class Msg : IMsg { } public class Pub where T : IMsg { public event Action notify; […]

ASP.NET MVC 2 – 绑定到抽象模型

如果我有以下强类型视图: <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage” %> 位置是抽象类。 我有以下控制器,它通过POST接受强类型模型: [HttpPost] public ActionResult Index(Location model) 我收到一个运行时错误,指出“无法创建抽象类 这当然有道理。 但是 – 我不确定这里最好的解决方案是什么。 我有很多具体的类型(大约8个),这是一个只能编辑抽象类属性的视图。 我试图做的是为所有不同的具体类型创建重载,并以通用方法执行我的逻辑。 [HttpPost] public ActionResult Index(City model) { UpdateLocationModel(model); return View(model); } [HttpPost] public ActionResult Index(State model) { UpdateLocationModel(model); return View(model); } 等等 然后: [NonAction] private void UpdateLocationModel (Location model) { // ..snip – update […]

在c#中执行此通用抽象类的最佳方法是什么?

我知道我做得不对,但我也知道有办法做到这一点。 我试图尽可能地通用和抽象,否则我的代码将变得非常混乱。 所以我在这里使用策略模式作为GetAggregateClient()方法。 我想要一个名为AbstractAggregate的抽象类,以便它使用generics。 将使用的类型是一系列数据类,即BlogItem,ResourceItem和AskItem。 这些数据类都inheritance自ListItem。 这就是背景信息。 这里的问题是我希望GetAbstractAggregate()返回一个实现AbstractAggregate的客户端类的实例,其中指定的项目类型取决于传入的枚举。但是,我不能返回“AbstractAggregate”。 编译器不会让我这样,因为AbstractAggregateFactory类不是通用的。 有没有人有最好的方法来做到这一点? 非常感谢。 public static class AggregateHelper { public enum AggregateTypes { TankTruckBlog, AskTankTruck, Resources } } public static class AbstractAggregateFactory { public static AbstractAggregate GetAggregateClient(AggregateHelper.AggregateTypes type) { switch (type) { case AggregateHelper.AggregateTypes.AskTankTruck: return new AskTankTruckAggregate(); case AggregateHelper.AggregateTypes.TankTruckBlog: return new TankTruckBlogAggregate(); case AggregateHelper.AggregateTypes.Resources: return new ResourcesAggregate(); default: […]

根据子类从基类指定抽象方法的返回类型

我有以下结构: abstract class Base { public abstract List Get(); //What should be the generic type? } class SubOne : Base { public override List Get() { } } class SubTwo : Base { public override List Get() { } } 我想创建一个抽象方法,返回具体子类的任何类。 因此,从示例中可以看出, SubOne的方法应返回List而SubTwo的方法应返回List 。 我在Base类中声明的签名中指定了什么类型? [UPDATE] 谢谢你发布的答案。 解决方案是使抽象类具有通用性,如下所示: abstract class Base { public abstract List […]