天道酬勤,学无止境

有人可以解释 MustOverride 吗?(Can Someone Explain MustOverride?)

问题

有人可以解释 MustOverride 的作用,但为什么要使用它? 是为了暴露功能吗?

我有两个类,第一个(RoomFactory);

Public MustInherit Class RoomFactory : Inherits baseFactory
Private _roomid As Integer = 0
Private _roomname as String = ""

Public Sub New()

End Sub

Public Sub New(ByVal roomid As Integer, ByVal roomname As String)
    Me.RoomId = roomid
    Me.RoomName = roomname
End Sub

Public MustOverride Function CreateRoom(ByVal roomdetails As RoomFactory) As Integer
Public MustOverride Function IsRoomAvailable(ByVal roomdetails as RoomFactory) As Boolean
// .. properties removed for brevity .. //

二等(房间)

Public Class Room : Inherits RoomFactory
    Public Function CreateRoom(ByVal roomdetails As RoomFactory) As Integer
        Return 0
    End Function
    Public Function IsRoomAvailable(ByVal roomdetails As RoomFactory) As Boolean
        Return False
    End Function
End Class

首先,我认为这是正确的,但希望对其他方面的任何建议 - 性能等。但我想主要问题是 - 为什么使用 MustOverride?

请原谅我在这里的无知。

回答1

这样您就可以在基类中提供通用功能,但强制派生类自己实现特定的功能位。

在您的工厂情况下,我建议使用接口而不是抽象类,但在其他情况下它是有意义的。 System.Text.Encoding是抽象类的一个很好的例子, System.IO.Stream也是如此。

回答2

您可以将Overrideable用于在基类中具有默认实现的方法。
如果没有(合理的)默认实现是可能的,请使用Mustoverride

回答3

我不是 VB.NET 专家,但肯定做过 C#。 在 C# 中,等价于抽象关键字。 它应该用于您希望从 RoomFactory 类派生的所有类实现您定义为抽象的某些行为的情况。

假设在您的示例中,如果您希望从 RoomFactory 类创建的所有 Room 对象返回其大小。 您将在 Roomfactory 中创建一个必须覆盖的函数,例如 ReturnSize,并且从该函数继承的任何类型的房间都应实现此函数。

你可以对接口做同样的事情。 但是使用这样的 MustInherit 类允许您在 RoomFactory 中添加一些默认行为,这些行为对于所有房间都是通用的。

希望这可以帮助。

回答4

MustOverride 指定一个属性或过程不在此类中实现,必须在派生类中重写后才能使用。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Can Someone Explain MustOverride?
    Can someone explain not what MustOverride does, but why use it? Is it to expose the function? I have two classes, the first (RoomFactory); Public MustInherit Class RoomFactory : Inherits baseFactory Private _roomid As Integer = 0 Private _roomname as String = "" Public Sub New() End Sub Public Sub New(ByVal roomid As Integer, ByVal roomname As String) Me.RoomId = roomid Me.RoomName = roomname End Sub Public MustOverride Function CreateRoom(ByVal roomdetails As RoomFactory) As Integer Public MustOverride Function IsRoomAvailable(ByVal roomdetails as RoomFactory) As Boolean // .. properties
  • @MustOverride 注释?(@MustOverride annotation?)
    问题 在 .NET 中,可以为特定超类中的方法指定“mustoverride”属性,以确保子类覆盖该特定方法。 我想知道是否有人有可以达到相同效果的自定义 java 注释。 基本上我想要的是推动子类覆盖超类中的方法,该方法本身具有一些必须贯穿的逻辑。 我不想使用抽象方法或接口,因为我希望在超级方法中运行一些通用功能,但或多或​​少会产生编译器警告/错误,表示派生类应该覆盖给定的方法。 回答1 我不太明白为什么你不想使用抽象修饰符——这是为了强制子类实现,只需要用于某些方法,而不是全部。 或者,也许您正在考虑 C++ 风格的“纯抽象”类? 但许多 Java 开发人员不知道的另一件事是,也可以覆盖非抽象方法并将它们声明为抽象的; 喜欢: public abstract String toString(); // force re-definition 这样即使java.lang.Object已经定义了一个实现,您也可以强制子类再次定义它。 回答2 忽略抽象方法,Java 中没有这样的功能。 也许可以创建一个编译时注释来强制这种行为(我不相信是这样),但就是这样。 真正的关键是“覆盖超类中的方法,该方法本身具有必须运行的某些逻辑”。 如果你覆盖一个方法,除非你显式调用它,否则不会调用超类的方法。 在这种情况下,我倾向于做类似的事情: abstract public class
  • 访问类库中的 mustoverride 属性时出现 AccessViolationException(AccessViolationException when accessing a mustoverride property in a class library)
    问题 这有点复杂,但我会尽量解释清楚。 我有一个通用代码组件的类库; 我尝试创建一些通用的ConfigurationHandler基类,以简化创建自定义配置部分、集合和元素的过程。 我最终得到的是: ConfigurationSectionBase类是通用的,将TConfElementCollection As {ConfigurationElementCollection, New}作为类型约束。 此ConfigurationSectionBase类包含一个Public MustOverride Property Collection As TConfElementCollection 。 这个想法是,在使用类库的项目中,他们只需覆盖集合并使用<ConfigurationProperty("CollectionName")>属性对其进行装饰,例如: <ConfigurationProperty("CollectionName")> Public Overrides Property Collection As DerivedConfigurationElementCollection Get Return TryCast(Me("CollectionName"), DerivedConfigurationElementCollection) End Get Set(value
  • AccessViolationException when accessing a mustoverride property in a class library
    This is a little complex, but I'll try and explain clearly. I have a class library for common code components; and I tried to make some common ConfigurationHandler base classes, to simplify creating custom configuration sections, collections and elements. What I've ended up with is: The ConfigurationSectionBase class is generic, taking TConfElementCollection As {ConfigurationElementCollection, New} as a type constraint. This ConfigurationSectionBase class contains a Public MustOverride Property Collection As TConfElementCollection. The idea is that in the project using the class library, they
  • 存储实现多个接口并从某个基(.net)派生的对象(Storing an object that implements multiple interfaces and derives from a certain base (.net))
    问题 在 .net 中,可以使用泛型,以便函数可以接受支持一个或多个接口并从基类型派生的参数,即使不存在所有有效参数类型都从其派生的任何单一类型。 例如,可以说: Sub Foo(Of T As {IInterface1, IInterface2, SomeBaseType})(Param as T) 并允许传递实现 IInterface1 和 IInterface2 的 SomeBaseType 的任何派生类。 即使 SomeBaseType 不支持 Interface1 和 Interface2,这也会起作用,并且实现这些接口的类不共享也实现它们的任何共同祖先。 如果在函数退出后不需要将参数保留在任何地方,这将非常方便。 不幸的是,我无法找到一种方法来持久化传入的参数,以便以后可以将其传递给类似的函数,除非使用反射。 有什么好的方法吗? 我能想到的最接近的是定义一个接口 INest(也许不是最好的名字——有人能改进它吗?)因此: Interface INest(Of Out T) Function Nest() As T End Interface 对于将与其他接口或基类“约束”结合使用的任何接口,请定义一个通用版本,如下所示 Interface IFun1 ' Any members of the interface go here, e.g. ...' Sub DoFun1
  • @MustOverride annotation?
    In .NET, one can specify a "mustoverride" attribute to a method in a particular superclass to ensure that subclasses override that particular method. I was wondering whether anybody has a custom java annotation that could achieve the same effect. Essentially what i want is to push for subclasses to override a method in a superclass that itself has some logic that must be run-through. I dont want to use abstract methods or interfaces, because i want some common functionality to be run in the super method, but more-or-less produce a compiler warning/error denoting that derivative classes should
  • 在Objective-C中创建抽象类(Creating an abstract class in Objective-C)
    问题 我最初是一名Java程序员,现在使用Objective-C。 我想创建一个抽象类,但是在Objective-C中似乎不可能。 这可能吗? 如果没有,我在Objective-C中能接近一个抽象类吗? 回答1 通常,Objective-C类仅按惯例是抽象的-如果作者将一个类记录为抽象的类,请不要在不对其进行子类化的情况下使用它。 但是,没有编译时强制执行阻止抽象类的实例化。 实际上,没有什么可以阻止用户通过类别(即在运行时)提供抽象方法的实现。 您可以通过在抽象类的方法实现中引发异常来强制用户至少重写某些方法: [NSException raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; 如果您的方法返回一个值,则使用起来会更容易一些 @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] userInfo:nil]
  • 抽象类/方法,如何 C# --> VB.NET(Abstract class / method , how to C# --> VB.NET)
    问题 我更熟悉VB,我买的书有C#示例,现在我卡住了。 如何在 VB.NET 中实现以下内容? public abstract class ENTBaseDATA<T> where T : IENTBaseEntity { public abstract List<T> Select(); public abstract T Select(int id); etc....This code already is converted :) } 完整代码见第 2 章下载: http://www.wrox.com/WileyCDA/WroxTitle/productCd-0470396865,descCd-DOWNLOAD.html 回答1 您可以尝试使用 C#/VB.NET 转换器。 输出: Public MustInherit Class ENTBaseDATA(Of T As IENTBaseEntity) Public MustOverride Function [Select]() As List(Of T) Public MustOverride Function [Select](ByVal id As Integer) As T ' and then the other code ' End Class 回答2 你应该知道: 抽象类: 在 C# 中:
  • VB.NET 是否支持虚拟事件?(Does VB.NET support virtual events?)
    问题 继续这个问题。 VB.NET 是否支持虚拟事件? 回答1 VB 是否支持虚拟事件的 CLR 概念 不可以。这是我们已经考虑支持但在给定语言周期中未达到我们当前标准的内容。 VB 是否支持自定义事件的层次结构的想法 是的。 您可以使用自定义事件语法来允许层次结构控制的事件。 MustInherit Class Base Public Custom Event Event1 As EventHandler AddHandler(ByVal value As EventHandler) AddEvent1(value) End AddHandler RemoveHandler(ByVal value As EventHandler) RemoveEvent1(value) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) RaiseEvent1(sender, e) End RaiseEvent End Event Protected MustOverride Sub AddEvent1(ByVal value As EventHandler) Protected MustOverride Sub RemoveEvent1(ByVal value As
  • 何时子类化而不是区分行为(When to Subclass instead of differentiating the behaviour)
    问题 我在决定何时应该进行子类化时遇到困难,而不是仅仅添加一个代表类的不同模式的实例变量,然后让类的方法根据选定的模式进行操作。 例如,假设我有一个基本的汽车类。 在我的程序中,我将处理三种不同类型的汽车。 赛车、公共汽车和家庭模型。 每个人都有自己的齿轮实现方式,它们如何转动和座椅设置。 我应该将我的汽车细分为三种不同的模型,还是应该创建一个类型变量并使齿轮、转向和座椅通用,以便它们根据选择的汽车类型而有所不同? 在我目前的情况下,我正在开发一个游戏,我开始意识到它开始变得有点混乱,所以我就可能重构我当前的代码征求意见。 基本上有不同的地图,每个地图可以是三种模式之一。 根据定义地图的模式,会有不同的行为,并且地图将以不同的方式构建。 在一种模式中,我可能不得不在超时的基础上向玩家出租并生成生物,其中另一个是玩家负责生成生物,而在另一种模式中,可能会有一些自动生成的生物以及玩家生成的生物和玩家建造建筑物. 所以我想知道是否最好有一个基本地图类,然后将其子类化为每个不同的模式,或者是否继续我当前的路径,根据地图类型变量的设置添加差异化行为. 回答1 在此线程中回答 http://www.xtremevbtalk.com 的 AtmaWeapon 的所有功劳 这两种情况的核心是我认为面向对象设计的基本规则:单一职责原则。 表达方式有两种: "A class should have
  • VB.NET类继承基类并实现接口问题(在C#中有效)(VB.NET class inherits a base class and implements an interface issue (works in C#))
    问题 我正在尝试在VB.NET中创建一个继承基本抽象类并实现接口的类。 该接口声明了一个名为Description的字符串属性。 基类包含一个名为Description的字符串属性。 主类继承基类并实现接口。 基类中存在Description属性可以满足接口要求。 这在C#中可以正常工作,但会在VB.NET中引起问题。 首先,这是一个有效的C#代码示例: public interface IFoo { string Description { get; set; } } public abstract class FooBase { public string Description { get; set; } } public class MyFoo : FooBase, IFoo { } 现在,这里是VB.NET版本,该版本会给出编译器错误: Public Interface IFoo Property Description() As String End Interface Public MustInherit Class FooBase Private _Description As String Public Property Description() As String Get Return _Description End Get Set(ByVal value
  • 通用的多层数据访问模式?(Generic multi-layer data access pattern?)
    问题 我一直在尝试一些用于 n 层数据访问的新模式,并且遇到了一种看起来非常灵活且易于实现的模式。 基本上,我需要一个可以使各种数据层即时可插拔/交换的解决方案 - 即从数据库访问基本数据、分布式缓存、本地缓存等。 下面的代码很容易重用并且非常高效 - 只比我以前的完全硬编码的解决方案长了几个滴答声。 这看起来如何? 有什么办法可以更好地实施吗? 任何一般的想法或批评? 使用过类似模式的人有什么意见吗? 基类: public class DataAdapterFactory<T> where T : class { private DataAdapter<T> Adapter; public DataAdapterFactory(DataAdapterBase<T> Base) { Adapter = Base; } public void Extend<U>() where U : DataAdapterExtender<T>, T, new() { DataAdapterExtender<T> Extender = new U(); Extender.BaseAdapter = Adapter as T; Adapter = Extender; } public T GetAdapter() { return Adapter as T; } } public class
  • Searching systematic, comprehensive and complete comparison between the syntax of VB.NET and C#
    I’m an experienced VB.NET developer, who wants to start with C#. I’m searching for a web based comparison between both languages syntax as quick reference. I found myself arranging VB.NET syntax templates such as... Public MustInherit Class BaseClass Public MustOverride Sub PublicMustOverrideSub(ByVal byValParam As Integer, ByRef byRefParam As String) Protected MustOverride Function ProtectedMustOverrideFunc() As Double Friend Sub FriendSubWithParamArray(ByVal ParamArray params() As Byte) End Sub Private Property PrivateProperty() As Integer Get End Get Set(ByVal value As Integer) End Set End
  • 是否可以在 VB.NET 中覆盖属性并返回派生类型?(Is it possible to override a property and return a derived type in VB.NET?)
    问题 考虑以下表示订购系统的类: Public Class OrderBase Public MustOverride Property OrderItem as OrderItemBase End Class Public Class OrderItemBase End Class 现在,假设我们想将这些类扩展到一组更具体的订单类,同时保持 OrderBase 的聚合性质: Public Class WebOrder Inherits OrderBase Public Overrides Property OrderItem as WebOrderItem End Property End Class Public Class WebOrderItem Inherits OrderItemBase End Class WebOrder 类中的 Overriden 属性将导致错误,指出返回类型与 OrderBase 中定义的类型不同……但是,返回类型是 OrderBase 中定义的类型的子类。 为什么VB不允许这样做? 回答1 你不能这样做 - 它正在改变在基础上定义的签名。 要做你想做的事情,你需要使用泛型: Public Class OrderBase(Of T As IOrderItem) Public ReadOnly Property OrderItems As
  • 有人可以向我解释程序集类的功能吗?(Can someone explain me the functionality of the Assembly Class to me?)
    问题 我想在运行时加载和创建程序集,有人告诉我使用命名空间 System.Reflection.Assembly 和 System.Reflection.Emit。 我找到的唯一参考资料是在 msdn 上,但是当您不知道从哪里开始以及如何开始时,使用它并不是很好。 我已经用谷歌搜索过,但没有找到任何有用的教程/示例/参考资料。 有人可以向我解释功能或给我一些示例/教程吗? 回答1 http://msdn.microsoft.com/en-us/library/saf5ce06.aspx public static void CompileScript(string source) { CompilerParameters parms = new CompilerParameters(); parms.GenerateExecutable = true; parms.GenerateInMemory = true; parms.IncludeDebugInformation = false; parms.ReferencedAssemblies.Add("System.dll"); // Add whatever references you might need here CodeDomProvider compiler = CSharpCodeProvider
  • 有人可以简要解释一下单点登录吗? 我想使用 openid 作为 SSO(can someone briefly explain Single sign on? i want to use openid as SSO)
    问题 有人可以解释我在基于 php 的网站上实现 SSO 应该遵循的步骤。 例如,用户登录到 www.siteA.com,当他访问 www.siteB.com 时,他应该已经登录了。(在我的情况下)。 siteB 如何识别用户? 用户是否必须再次输入 openid? 回答1 看看 PHP 的简单单点登录。 OpenID 并不完全相同。 单点登录是指在一个位置登录并在其他位置自动对您进行身份验证。 OpenID 是关于将身份验证委托给 OpenID 提供者,以便您可以使用一组凭据有效地登录到多个站点。 值得注意的是,StackOverflow 使用 OpenID 将不同站点之间的用户关联起来。 你是这个意思吗? 因为这不是 SSO,因为您需要分别登录到每个站点。 此外,某些 OpenID 提供商(尤其是 Google)在他们不会向每个站点发送相同标识符的意义上并不擅长,因此您无法知道每个站点上的令牌来自同一组凭据。 您可以使用 OpenID 作为 SSO 的身份验证方案,但这是偶然的。
  • 有人可以解释 DBCC DROPCLEANBUFFERS 吗?(Can someone explain DBCC DROPCLEANBUFFERS?)
    问题 有人可以解释DBCC DROPCLEANBUFFERS与CHECKPOINT运算符的使用并提供示例吗? 我知道在您的查询之前测试运行的性能很有用,但我没有完全掌握它。 我也不知道与 CHECKPOINT 运算符结合使用。 如果我在查询之前执行它,它们需要更长的时间才能运行,所以我猜比较性能但不准确地评估它们是很好的。 任何帮助,将不胜感激! 回答1 CHECKPOINT 将修改后的数据页刷新到磁盘: [CHECKPOINT] 将当前数据库的所有脏页写入磁盘。 脏页是已进入缓冲区缓存并修改但尚未写入磁盘的数据页。 检查点通过创建一个点来确保所有脏页都已写入磁盘,从而在以后的恢复过程中节省时间。 DBCC DROPCLEANBUFFERS 然后删除任何非脏(低,干净)的页面: 使用 DBCC DROPCLEANBUFFERS 测试具有冷缓冲区缓存的查询,而无需关闭和重新启动服务器。 要从缓冲池中删除干净的缓冲区,首先使用 CHECKPOINT 生成冷缓冲区缓存。 这会强制将当前数据库的所有脏页写入磁盘并清理缓冲区。 执行此操作后,您可以发出 DBCC DROPCLEANBUFFERS 命令以从缓冲池中删除所有缓冲区。 最终结果是您开始时没有缓存任何内容。
  • 有人可以向我解释CALayer contentsRect属性的坐标系吗?(Can someone explain the CALayer contentsRect property's coordinate system to me?)
    问题 我意识到contentsRect财产CALayer (文件在这里)允许定义多少层使用的绘制,但我不明白的坐标系统是如何工作的,我想。 似乎当宽度/高度较小时,用于内容的区域较大,反之亦然。 类似地,负的x,y位置似乎使内容区域向下和向右移动,这与我的直觉相反。 有人可以解释为什么吗? 我敢肯定有充分的理由,但是我想我缺少一些图形编程背景。 回答1 CALayer的contentsRect属性(此处提供文档)允许您定义要用于绘制的图层数量 不,您正在错误地考虑它。 contentsRect指定将在图层中显示contents图像的哪一部分。 然后根据contentsGravity属性将该部分布置在图层中。 如果这是默认值kCAGravityResize ,这将导致零件被调整大小以适合图层。 这可以解释您所看到的违反直觉的行为-您可以使contentsRect变小,但是该图层的大小似乎相同,并且在图像的选定部分上似乎“放大”。 如果将contentsGravity设置为不会调整大小的kCAGravityCenter ,可能会更容易理解。 大多数时候,你会设定contentsRect的身份矩形的某些子RECT { {0, 0}, {1, 1} }所以你选择只查看的内容的一部分。 (如果愿意,可以将它们视为百分比-如果contentsRect的大小为{0.5, 0.5} ,则选择50
  • 有人可以解释管道缓冲区死锁吗?(Can someone explain pipe buffer deadlock?)
    问题 Popen 的 Python 文档指出: 警告使用communication() 而不是.stdin.write、.stdout.read 或.stderr.read 来避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致的死锁。 现在,我试图弄清楚这种僵局是如何发生的以及为什么会发生。 我的心智模型:subproccess 向 stdout/err 产生一些东西,它被缓冲,缓冲区被填充后,它被刷新到 subproccess 的 stdout/err,它通过管道发送到父进程。 根据文档说明,管道有自己的缓冲区,当它被填充或子进程终止时,它会被刷新到父进程。 无论哪种方式(是否使用管道缓冲区),我都不完全确定死锁是如何发生的。 我唯一能想到的是某种“全局”操作系统管道缓冲区进程将努力争取,这听起来很奇怪。 另一个是更多的进程将共享同一个管道,这不应该单独发生。 有人可以解释一下吗? 回答1 小心,这里面有一个微妙的错误。 我的心智模型:subproccess 向 stdout/err 产生一些东西,它被缓冲,缓冲区被填充后,它被刷新到 subproccess 的 stdout/err,它通过管道发送到父进程。 缓冲区由父进程和子进程共享。 子进程向 stdout 产生一些东西,这与父进程应该从中读取的缓冲区相同。 当缓冲区被填满时,写入停止,直到缓冲区被清空。 Flush
  • 有人可以解释Shell Shock Bash代码吗? [复制](Can someone explain the Shell Shock Bash code? [duplicate])
    问题 这个问题已经在这里有了答案: Bash中的Shellshock漏洞背后的行为是否已被记录或完全是有意的? (4个答案) 6年前关闭。 我在理解以下代码时遇到问题,这是Shell Shock的“漏洞证明”代码。 有人可以向我解释吗? 特别地,这部分是“ () { :;}; :; () { :;}; ” env x='() { :;}; echo vulnerable' bash -c "echo this is a test" 回答1 env x='() { :;}; echo vulnerable' bash -c "echo this is a test" env是什么? 从文档中, env在修改后的环境中运行程序 env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...] 很明显, x是一个名称/变量,而() { :;}; echo vulnerable' () { :;}; echo vulnerable'是该变量的值 现在是() { :;}; ? 导出函数时,bash将其定义存储为环境变量的值 $ x() {echo hello world;} $ export x $ env | grep x x=() {echo hello world}; 现在,当x='() {:;}'含义与写作相似 $ x() {:;} $