Tag: inheritance

inheritance另一个类的类是否inheritance了inheritance类/接口的类?

我有两节课: public class Question : IDisposable, IEquatable { } public class SessionQuestion : Question, IDisposable, IEquatable { } 由于Questioninheritance了IDisposable和IEquatable , IEquatable是否SessionQuestion隐式inheritance了这些接口?

C#选择与可选参数和多级inheritance所期望的方法不同的方法

在给定的示例中(对于代码样式很抱歉,它是为了一个紧凑的自包含repro),被调用的方法总是B中的虚方法,它有附加的整数参数,而我希望这个方法在C将是一个叫做的人。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MethodChoosing { class Program { static void Main(string[] args) { C c = new C(); cM(); Console.ReadKey(); } } public class A { public virtual void M(bool? a = null) { Console.WriteLine(“base base”); } } public class B : A { public override void M(bool? […]

可访问性不一致:基类比子类更难访问

我正在读约瑟夫阿尔巴巴里和本阿尔巴巴里的书“简而言之的C#4.0”。 从那里我发现访问修饰符的主题限制。 第91页,主题“访问修饰符的限制”。 从书中引用。 编译器可防止任何不一致的访问修饰符的使用。 例如,子类本身可以比基类更难访问,但不能更多 所以这说明基类应该与子类相同或更易于访问。 因此,如果基类是内部的,那么子类应该是私有的或内部的。 如果基类是私有的,而子类是公共的,那么将生成编译时错误。 在Visual Studio中尝试此操作时,我发现了一些奇怪的行为。 尝试1:Base是私有的,子类是私有的(Works,正确的行为)如果两者都是内部的,那么它也有效。 private class A { } private class B : A { } // Works 尝试2:Base是私有的,子类是public或internal(这是失败的,正确的行为) private class A { } public class B : A { } // Error 尝试3:Base是内部的,sub是公共的(这是有效的,但它应该失败。因为Base比子类更难访问 internal class A { } public class B : A { } // […]

返回自己类型的方法的接口

我有一个class级的情况 class Foo { Foo Bar() { return new Foo(); } } 现在我想为它创建一个界面 class IFoo { ??? Bar(); } 什么应该代替问号? 每个类都应该返回它自己的类型,而不是Foo。 以下解决方案有效,但看起来并不干净。 我不明白为什么我必须两次指定同一个类,并且当前类型没有类似“this”的东西 这是我以后使用它的方式 class GenericClass where T : IFoo { T foo = new T(); T item = foo.Bar(); }

为什么C#数组没有Count属性?

可能重复: 计数与集合中的长度与大小 真奇怪: C#数组如下 double[] test = new double[1]; 支持Length属性以获取数组的大小。 但是数组也实现了IList接口: IList list = test; 但是,IList接口还提供Count属性。 为什么arrays(在这种情况下为“测试”)没有? 编辑 :感谢所有人,他们指出它实际上是提供Count属性的ICollection接口(不是IList),而且这也是由于接口的显式实现。

为什么inheritance不按我认为应该工作的方式工作?

我有一些inheritance问题,因为我有一组相互关联的抽象类需要全部重写以创建客户端实现。 理想情况下,我想做类似以下的事情: abstract class Animal { public Leg GetLeg() {…} } abstract class Leg { } class Dog : Animal { public override DogLeg Leg() {…} } class DogLeg : Leg { } 这将允许任何使用Dog类的人自动获取DogLegs以及使用Animal类获取Legs的任何人。 问题是被覆盖的函数必须与基类具有相同的类型,因此不会编译。 我不明白为什么不应该这样,因为DogLeg可以隐式地施放到Leg。 我知道有很多方法可以解决这个问题,但我更好奇为什么这不可能/在C#中实现。 编辑 :我有点修改,因为我实际上在我的代码中使用属性而不是函数。 编辑 :我将其更改回函数,因为答案仅适用于那种情况(属性的set函数的value参数的协方差不应该起作用)。 对不起波动! 我意识到这使得许多答案看起来无关紧要。

C#hack:接口和抽象类之间的低级别差异

这是一个关于C#基础知识的哲学问题:我想知道完全抽象类可以模拟接口的接近程度。 假设我们有以下界面: public interface INativeInterface { void PerformAction(); String Property { get; set; } } 以及抽象类: public abstract class ISimulatedInterface { public abstract void PerformAction(); public abstract String Property { get; set; } } 他们有很多共同点,不是吗? 我所知道的差异是: 多重inheritance不适用于抽象类 显式实现不适用于抽象类 使用reflection或类似的东西可以跳过这些限制吗? 我意识到接口和抽象类在root中是不同的:接口声明了“ 可以表现得像 ”的条件,抽象类 – “ 是一种 ”,但即使这似乎是如此接近以至于这些实体之间的低级别差异要讨论的。 这个问题甚至可以听起来像“你会用C ++创建一个接口”。

inheritance类的输出无效

我有2节课 [DataContract, KnownType(typeof(B))] public class A { [DataMember] public string prop1 { get; set; } [DataMember] public string prop2 { get; set; } [DataMember] public string prop3 { get; set; } } [DataContract] public class B : A { [DataMember] public string prop4 { get; set; } } 以及以下方法: List BList = new List(); BList […]

C#exceptioninheritance语法w /generics

我在NHibernate类定义中遇到了这个问题: public class SQLiteConfiguration : PersistenceConfiguration 所以这个类inheritance自一个由派生类参数化的基类? 我的脑袋爆炸了。 有人可以解释这意味着什么以及这种模式有用吗? (顺便说一句,这不是一个特定于NHibernate的问题。)

C#私有(隐藏)基类

是否可以使C#基类只能在它编译成的库程序集中访问,同时使从其inheritance的其他子类公开? 例如: using System.IO; class BaseOutput: Stream // Hidden base class { protected BaseOutput(Stream o) { … } …lots of common methods… } public class MyOutput: BaseOutput // Public subclass { public BaseOutput(Stream o): base(o) { … } public override int Write(int b) { … } } 在这里,我希望我的库的客户端无法访问BaseOutput类,但允许子类MyOutput完全公开。 我知道C#不允许基类比子类具有更多限制性访问,但是还有其他一些法律方法可以实现相同的效果吗? UPDATE 我对这个特定库的解决方案是将基类设置为public和abstract ,并使用“不要直接使用此基类”来记录它。 我还使基类的构造函数internal ,这有效地防止外部客户端使用或inheritance该类。 (这很遗憾,因为其他OO语言让我有隐藏的基类。)