.net 具有接口和抽象的类的设计

.net 具有接口和抽象的类的设计,.net,c#-4.0,c#-3.0,.net,C# 4.0,C# 3.0,嗨,伙计们,我是c#的新手, 我从微软找到了下面的答案,使用界面的建议和摘要 如果您希望创建组件的多个版本,请创建一个抽象类。抽象类提供了一种简单易行的方法来对组件进行版本设置。通过更新基类,所有继承类都会随更改自动更新。另一方面,接口一旦创建就无法更改。如果需要新版本的接口,则必须创建一个全新的接口 创建组件的多个版本是什么意思。你能再举个例子吗 当您使用基类时,使用具有某种行为和/或属性的类似类是非常困难的。其中一个典型的例子是形状。你可以这样做: 基本抽象类-四边形 具有将所有四条边相加

嗨,伙计们,我是c#的新手, 我从微软找到了下面的答案,使用界面的建议和摘要

如果您希望创建组件的多个版本,请创建一个抽象类。抽象类提供了一种简单易行的方法来对组件进行版本设置。通过更新基类,所有继承类都会随更改自动更新。另一方面,接口一旦创建就无法更改。如果需要新版本的接口,则必须创建一个全新的接口


创建组件的多个版本是什么意思。你能再举个例子吗

当您使用基类时,使用具有某种行为和/或属性的类似类是非常困难的。其中一个典型的例子是形状。你可以这样做:

基本抽象类-四边形

  • 具有将所有四条边相加的GetPermiture方法
  • 具有抽象的GetArea方法(必须由派生类定义)
派生类-矩形

  • 自动免费获取GetPermiture方法
  • 必须使用length x width实现GetArea方法
派生类-平行四边形

  • 自动免费获取GetPermiture方法
  • 必须使用base x height实现GetArea方法
派生类还可以添加它们想要的、不属于基类的任何独特行为


注意:抽象类是不能直接建立的类。您必须使用其中一个派生类。

如果有类似的类共享某种行为和/或属性,则可以使用基类。其中一个典型的例子是形状。你可以这样做:

基本抽象类-四边形

  • 具有将所有四条边相加的GetPermiture方法
  • 具有抽象的GetArea方法(必须由派生类定义)
派生类-矩形

  • 自动免费获取GetPermiture方法
  • 必须使用length x width实现GetArea方法
派生类-平行四边形

  • 自动免费获取GetPermiture方法
  • 必须使用base x height实现GetArea方法
派生类还可以添加它们想要的、不属于基类的任何独特行为


注意:抽象类是不能直接建立的类。您必须使用其中一个派生类。

这确实应该是两个问题,但我将同时回答这两个问题

第二个优先:可空类型的用法是:

decimal? priceFromDb = datarow.Field<decimal?>("price");
第一个问题: C#中使用了一个接口,以确保类或结构实现了您需要的一些关键功能。它们通常只包含少数几个方法,通常不超过一个或两个,其思想是一旦您创建了一个已发布的接口,它就不会改变。另一方面,抽象类使您能够强制类实现所需的方法,并为它们提供公共功能。如果您将来更改抽象类,例如添加更多公共功能,继承类将自动获得这些功能。使用抽象类并不是进行突破性更改的许可证,它只是在一个更干净的函数中将常见功能组合到一个类中的一种方法。我能描述的最好方法是使用抽象类来定义对象及其子对象的核心属性,并使用接口来描述类的一个关键行为

如果您查看一下.Net Framework,您会发现大多数接口(,)通常用于在对象上强制执行行为,而不是其整个结构

作为一个例子,考虑一个抽象类车辆:

abstract class Vehicle
{
    public int NumWheels { get; set; }
    public string Name { get; set; }
    public abstract void Drive();
    public override string ToString()
    {
        return "I am a vehicle!";
    }
}
您可以创建一个从车辆继承的car对象,并且需要实现
Drive()
,但将免费获得两个属性
NumWheels
Name
。如果需要,您的继承类car也可以重载
ToString()
,或者保持原样:

public class Car : Vehicle
{
    public override void Drive()
    {
        // your implementation here
    }

    public override string ToString()
    {
        return "I am a car!";
    }
}

这应该是两个问题,但我会同时回答

第二个优先:可空类型的用法是:

decimal? priceFromDb = datarow.Field<decimal?>("price");
第一个问题: C#中使用了一个接口,以确保类或结构实现了您需要的一些关键功能。它们通常只包含少数几个方法,通常不超过一个或两个,其思想是一旦您创建了一个已发布的接口,它就不会改变。另一方面,抽象类使您能够强制类实现所需的方法,并为它们提供公共功能。如果您将来更改抽象类,例如添加更多公共功能,继承类将自动获得这些功能。使用抽象类并不是进行突破性更改的许可证,它只是在一个更干净的函数中将常见功能组合到一个类中的一种方法。我能描述的最好方法是使用抽象类来定义对象及其子对象的核心属性,并使用接口来描述类的一个关键行为

如果您查看一下.Net Framework,您会发现大多数接口(,)通常用于在对象上强制执行行为,而不是其整个结构

作为一个例子,考虑一个抽象类车辆:

abstract class Vehicle
{
    public int NumWheels { get; set; }
    public string Name { get; set; }
    public abstract void Drive();
    public override string ToString()
    {
        return "I am a vehicle!";
    }
}
您可以创建一个从车辆继承的car对象,并且需要实现
Drive()
,但将免费获得两个属性
NumWheels
Name
。如果需要,您的继承类car也可以重载
ToString()
,或者保持原样:

public class Car : Vehicle
{
    public override void Drive()
    {
        // your implementation here
    }

    public override string ToString()
    {
        return "I am a car!";
    }
}
可能是“抽象类和
void getMethod();
string getName();
int i = 4; 
int k = 3; 
public abstract void getClassName(); 
// Constructor Declaration 
public TestInterface() 
{ 
void getMethod(); 
string getName(); 
}
public TestAbstractClass() 
{ 
int i = 4; 
int k = 3; 
public abstract void getClassName(); 
}
void getMethod(); 
string getName(); 
public TestAbstractClass() 
{ 
int i = 4; 
int k = 3; 
public abstract void getClassName(); 

}
void getMethod(); 
string getName(); 
public void getMethod(); 
public string getName(); 
void getMethod(); 
string getName();