Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#从派生类继承或使用接口_C#_Class_Inheritance_Interface - Fatal编程技术网

c#从派生类继承或使用接口

c#从派生类继承或使用接口,c#,class,inheritance,interface,C#,Class,Inheritance,Interface,在c#中,是否可以从派生类继承?例如,我有以下结构,在C#中这样做合法吗?它可以编译,但我想知道这是否会在以后引起问题,并在某些情况下抛出错误 public class A { public string s1 { get; set; } public string s2 { get; set; } } public class B : A { public string s3 { get; set; } public string s4 { ge

在c#中,是否可以从派生类继承?例如,我有以下结构,在C#中这样做合法吗?它可以编译,但我想知道这是否会在以后引起问题,并在某些情况下抛出错误

public class A   
{
    public string s1 { get; set; }
    public string s2  { get; set; }
}

public class B : A   
{
    public string s3 { get; set; }
    public string s4 { get; set; }
}

public class C : B   
{
    public C()
    {
        this.S1 = "A prop";
        this.S2 = "A prop";
        this.S3 = "B prop";
        this.S4 = "B prop";
    }

    public string s5 { get; set; }
    public string s6 { get; set; }
}
我也可以使用接口,但据我所知,接口只是在实现它的任何东西上强制执行契约。因此,我仍然需要实现派生类中的所有属性。我想这并没有比这更多的代码,所以也许这是正确的方法?在这种情况下,我认为C实现IA和IB仅仅意味着C必须实现属性s1、s2、s3和s4。对吗?如果是这样,这是更好的方法吗?如果我在两种情况下都不在,请告诉我。谢谢

interface IA   
{
    string s1 { get; set; }
    string s2  { get; set; }
}

interface  IB : IA   
{
    string s3 { get; set; }
    string s4  { get; set; }
}

public class C : IA, IB   
{
    public C()
    {
        this.S1 = "A prop";
        this.S2 = "A prop";
        this.S3 = "B prop";
        this.S4 = "B prop";
    }

    public string s1 { get; set; }
    public string s2 { get; set; }
    public string s3 { get; set; }
    public string s4 { get; set; }
    public string s5 { get; set; }
    public string s6 { get; set; }
}

这是完全合法的,而且非常有用。查看
按钮的继承树


如果需要在类之间提供公共功能,基类通常是最好的方法。

这是完全合法的,并且非常有用。查看
按钮的继承树


如果您需要在类之间提供通用功能,基类通常是最好的方法。

您还有另一个选择~将类a和B抽象化。如果您不想拥有A和B的实例,请将其抽象化或接口化。

您也可以选择将类A和B抽象化。如果不希望有A和B的实例,请将其抽象化或接口化

在c#中,是否可以从派生类继承

如果你深入研究一下什么是C及其特性,你会发现C是一种完全面向对象的编程语言,因此答案很明显:

另一方面,使用严肃编译器的严肃编程语言不允许您执行ilegal操作。如果您可以编译它,那么从语法的角度来看它是有效的(它可能在运行时崩溃,但是storng类型的编译语言不允许您在设计时派生类,在运行时崩溃…)

关于接口。。。 接口不适合模拟继承。它们是契约,它们的用例是确保实现者需要向接口成员提供实现。此外,接口支持继承,但这是为了在其他接口的基础上创建更广泛的契约

在c#中,是否可以从派生类继承

如果你深入研究一下什么是C及其特性,你会发现C是一种完全面向对象的编程语言,因此答案很明显:

另一方面,使用严肃编译器的严肃编程语言不允许您执行ilegal操作。如果您可以编译它,那么从语法的角度来看它是有效的(它可能在运行时崩溃,但是storng类型的编译语言不允许您在设计时派生类,在运行时崩溃…)

关于接口。。。
接口不适合模拟继承。它们是契约,它们的用例是确保实现者需要向接口成员提供实现。此外,接口支持继承,但这是为了在其他接口的基础上创建更广泛的契约。

这实际上取决于您计划如何使用该类。这实际上取决于您计划如何使用该类。非常详细。我喜欢你在interfacesMatias中对“继承”的解释,希望我也能在你的编译器解释上给你一点建议,但我似乎不能。看起来你和我一样理解界面。我现在可以看出,根据肯德尔给出的例子,这是显而易见的。不过,我在谷歌上搜索了“从派生类继承”,找不到明确的示例。可能就在我面前,细节不错。我喜欢你在interfacesMatias中对“继承”的解释,希望我也能在你的编译器解释上给你一点建议,但我似乎不能。看起来你和我一样理解界面。我现在可以看出,根据肯德尔给出的例子,这是显而易见的。不过,我在谷歌上搜索了“从派生类继承”,找不到明确的示例。可能就在我面前。