Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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#_.net_Interface_Abstract Class - Fatal编程技术网

C#-我应该使用什么,接口、抽象类,还是两者都使用?

C#-我应该使用什么,接口、抽象类,还是两者都使用?,c#,.net,interface,abstract-class,C#,.net,Interface,Abstract Class,因此,假设我正在C#中构建某种房地产应用程序。对于每种类型的属性,我将创建一个类,例如ResidentialProperty和CommercialProperty。这两个类以及所有其他属性类将共享一些公共属性,例如Id、Title、Description和Address信息 我希望能够做到的是: a) 返回仅包含基本信息的对象集合 b) 能够调用诸如GetProperty(id)之类的方法,该方法将创建并返回ResidentialProperty或CommercialProperty,或者调用G

因此,假设我正在C#中构建某种房地产应用程序。对于每种类型的属性,我将创建一个类,例如ResidentialProperty和CommercialProperty。这两个类以及所有其他属性类将共享一些公共属性,例如Id、Title、Description和Address信息

我希望能够做到的是:
a) 返回仅包含基本信息的对象集合
b) 能够调用诸如GetProperty(id)之类的方法,该方法将创建并返回ResidentialProperty或CommercialProperty,或者调用GetProperties(),该方法将返回其中一个或另一个的集合,或者两者都返回

因此,创建一个名为BasicProperty(或PropertyBase)的抽象类可能是有意义的,它包含所有公共属性,并从中扩展ResidentialProperty和CommercialProperty。这将解决问题1,因为我可以创建一个返回基本属性集合的方法

但是对于#2,由于能够返回一种属性类型或另一种属性类型,我需要一个接口(IProperty),并让住宅类和商业类从中继承,然后让GetProperty(id)和GetProperties()返回一个IProperty对象(或者因为它们是从IProperty继承的,我可以按原样而不是按接口返回它们吗?)

现在,如果我应该使用接口,我该如何处理BasicProperty类?
-我是否将其作为抽象并实现接口?或
-我是否将它作为一个抽象,并且所有3个类都实现了接口?或者
-我不是将其创建为一个抽象,将所有基本信息放入接口中,并且基本属性、住宅属性和商业属性都实现了接口吗

提前感谢,,
卡尔J.

据我所知,你在这里谈论的是两件不同的事情

  • 阶级结构
  • 这些类的数据访问
  • 您认为应该创建一个抽象类来包含公共属性是正确的,这就是继承的目的:)(除其他外)

    但是我不明白为什么不能创建一个数据访问类,该类有一个方法
    GetProperty(id)
    ,该方法指定
    PropertyBase的返回类型

    i、 e

    publicpropertybase GetProperty(长id)

    GetProperty
    的实现中,您可以构造
    ResidentialProperty
    CommercialProperty
    (基于您想要的任何业务/数据库逻辑),然后返回它,c允许您这样做

    也许我想念你

    编辑::

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
    
        class DataAccessLayer
        {
            public PropertyBase GetSomething(int id)
            {
                if (id > 10)
                    return new CommercialProperty();
                else
                    return new ResidentialProperty();
            }
    
        }
    
        class PropertyBase { }
        class ResidentialProperty : PropertyBase { } 
        class CommercialProperty : PropertyBase { }
    }
    

    抽象类用于提供常见行为。接口用于提供一组特定的方法和属性,而不管它们的行为如何

    如果您的ResidentialProperty和CommercialProperty提供了一些常见的行为,那么在抽象类中实现这种行为并使它们各自继承自该类可能是有意义的。假设它们也会有一些自定义行为,否则就不需要子类,只需要有一个PropertyType属性来描述实例是哪种类型的属性就足够了

    然后,您可以提供您认为有用的尽可能多的接口,如IPropertyBase、IResidentialProperty和/或ICommercialProperty。这实际上取决于您是否希望将此库用作其他实现的基础,这些实现可能与一个或多个类具有相同的接口,但与基础抽象类的行为不同。公开表示您的类型的接口的另一个好处是更容易对单元测试进行模拟


    绝对地回答这个问题是不可能的,因为它实际上取决于对象的使用方式,但我希望这个答案能为您提供一个有用的指导。

    我认为您应该避免使用抽象类,除非绝对有意义

    许多常见行为可以通过聚合、使用组件提供给您的实体,您可以通过使用接口来宣传这种行为

    我倾向于走这条路线的原因是,一旦你有了一个抽象基类,你就必须使用它,因为你不能有多重继承

    迟早,你会遇到这样一种情况:你确实想要多重继承,但你完蛋了


    这并不是说我是一个强硬派,因为我们的很多代码库都使用了上述的基本抽象类,但是这些类实现了接口,所有在这些类上执行的代码都通过接口与它们进行通信,因此,如果必要的话,我们可以在以后切换基类以获得更灵活的功能。

    一个简单的例子,并不是我所看到的区别。即使在实现接口时,也可以始终使用抽象基类。接口不能帮助您避免应该避免的代码重复(请参阅),但它不会强迫您派生任何特殊的代码,从而使它们更容易与其他基类或接口组合


    另一方面,抽象基类可以消除一些重复,并且在不涉及派生类的情况下更容易更改基类中的某些内容。当您实现其他人使用的类库时,后者非常好。如果更改库中接口中的内容,则该接口的所有实现都需要更改!如果您只使用一小部分开发人员实现应用程序,那么这可能是一个非常小的问题。但正如其他人所说,基类迫使您从中派生,如果需要的话,您就不能从其他东西中派生。

    不要调用基类或接口BasicProperty或PropertyBase,只调用它Property即可。你不会同时拥有财产和财产