2013-07-04 201 views
-2

我在我的应用程序中有下面的代码。如何在C#中实现多继承?

public class GeneralInfo 
     { 
      private string _id; 
      private string _name;   

      public string id 
      { 
       set 
       { 
        _id = value; 
       } 
       get 
       { 
        return _id; 
       } 
      } 

      public string name 
      { 
       set 
       { 
        _name = value; 
       } 
       get 
       { 
        return _name; 
       } 
      } 

     } 

     public class SecureInfo 
     { 
      private string _password; 

      public string password 
      { 
       set 
       { 
        _password = value; 
       } 
       get 
       { 
        return _password; 
       } 
      } 

     } 


public class User 
{ 
} 

我需要在上面的代码中应用多重继承,即。类GeneralInfo,SecureInfo属性应该可以在用户类中访问。

我知道使用接口可以实现多重继承。但是我需要定义在Interface中受限的基类中的属性。

我该如何做到这一点?

+0

不是。 C#中没有多重继承。如果接口不适合你,那么你就没有选择。 – GolezTrol

+1

你确定你需要继承吗?你说“GeneralInfo类,SecureInfo属性应该可以在用户类中访问”。所以也许GeneralInfo和SecureInfo应该只是用户类的属性... –

+2

你确定你需要它吗?看起来像User _is a_'GeneralInfo',但我认为它有''SecureInfo'。 –

回答

5

C#不支持多重继承。但是,您可以通过多个接口来实现此目的

public interface ISecureInfo 
{ 

} 

public interface IGeneralInfo 
{ 

} 

public class UserClass : ISecureInfo, IGeneralInfo { 

} 
+7

一个类不会“继承”接口。他们执行它们。 – GolezTrol

+0

从接口继承类是一个可接受的术语,有时更准确。 –

0

您不能在C#中执行多继承,因为它不像C++那样受支持。在C#中,您可以使用它的接口并实现方法和属性。对于样本,你可以有一个基类

public abstract class Entity 
{ 
    public string Name { get; set; } 

} 

你也可以有一些接口:

public interface IPrint 
{ 
    void Print(); 
} 

public interface IGenerate 
{ 
    void Generate(); 
} 

而且使用它像倍数继承(但它不是,它只是一个单一的继承和接口)

public class User : Entity, IPrint, IGenerate 
{ 
    public void Print() 
    { 
    // some code 
    // here you could access Name property, because it is on base class Entity 
    } 

    public void Generate() 
    { 
    // some code 
    } 
} 

你可以例如,它使用抽象:

Entity e = new User(); 
IPrint p = new User(); 
IGenerate g = new User(); 
User u = new User(); 

如果需要实现,你可以做一个hiearachy继承,样品:

用户从人,从实体继承继承。

public class Entity 
{ 
    public int Id { get; set; } 


    public void Method() 
    { 
     // some code 
    } 
} 

public class Person : Entity 
{ 
    public string Name { get; set; } 

    public void AnotherMethod() 
    { 
     // some code 
    } 
} 

public class User : Person 
{ 
    public string Password { get; set; } 

    public bool CheckUser(string name, string passworkd) 
    { 
     // some code 
    } 
} 
+0

没有定义方法和属性,使用Interface对我来说没用。 –

+0

这只是一个建议...看看我的编辑 –

1

你可能更好的封装类中的数据,而不是试图在这里使用某些东西来做多重继承。有关这方面的一些参数,请参见this question

0

从你的样本描述,封装可能是你可能想使用什么:

public class Info{ 
    GeneralInfo general; 
    SecureInfo secure; 
... 
} 
1

您可以通过基于接口继承实现这一目标:

public interface IGeneralInfo 
{ 
    String Id { get; set; } 
    String Name { get; set; } 
} 

public interface ISecureInfo 
    String Password { get; set; } 
} 


public class User : IGeneralInfo, ISecureInfo 
{ 
    // Implementation of IGeneralInfo 
    public String Id { get; set; } 
    public String Name { get; set; } 

    // Implementation of ISecureInfo 
    public String Password { get; set; } 
} 

或者,再往前一步,通过组成:

public interface IGeneralInfo 
{ 
    String Id { get; set; } 
    String Name { get; set; } 
} 

public class GeneralInfo : IGeneralInfo 
{ 
    public String Id { get; set; } 
    public String Name { get; set; } 
} 

public interface ISecureInfo 
    String Password { get; set; } 
} 

public class SecureInfo : IGeneralInfo 
{ 
    public String Password { get; set; } 
} 

public class User : IGeneralInfo, ISecureInfo 
{ 
    private GeneralInfo generalInfo = new GeneralInfo(); 
    private SecureInfo secureInfo = new SecureInfo(); 

    public String Id { 
     get { return generalInfo.Id; } 
     set { generalInfo.Id = value; } 
    } 
    public String Name { 
     get { return generalInfo.Name; } 
     set { generalInfo.Name = value; } 
    } 

    public String Password { 
     get { return secureInfo.Password; } 
     set { secureInfo.Password = value; } 
    } 
} 
0

我认为最好的是分开执行接口和最终的真实课程。 我的意思是像桥梁模式。 你的类(它将实现几个接口)只会将方法调用删除到真正的实现中,你可以在一个独立的地方只有一次。

+0

你能提供一个例子吗? –

0

你也可以使用这样的方法。你会得到相同的点,如果你会使用多重继承。这样,如果你不需要SecureInfo的东西(例如书籍和其他东西),你可以继承唯一的实体。尽管如此,我认为在这种情况下,作曲会更好,因为别人说...

class User : SecuredEntity { } 

abstract class SecuredEntity : Entity, ISecureInfo 
{ 
    public string Password { get; set; } 
} 

abstract class Entity : IGeneralInfo 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

interface IGeneralInfo 
{ 
    string ID { get; set; } 
    string Name { get; set; } 
} 

interface ISecureInfo 
{ 
    string Password { get; set; } 
}