Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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# 使用虚方法的基类,并且只实现一个guard子句_C#_Oop - Fatal编程技术网

C# 使用虚方法的基类,并且只实现一个guard子句

C# 使用虚方法的基类,并且只实现一个guard子句,c#,oop,C#,Oop,如果您有一个定义如下的基类: public abstract class BaseMessageObject<T> where T : Entity { public string Message { get; set; } public abstract BaseMessageObject<T> BuildMessage(T entity); } public abstract class HtmlMessageObject&l

如果您有一个定义如下的基类:

public abstract class BaseMessageObject<T> where T : Entity
{        
  public string Message { get; set; }        
  public abstract BaseMessageObject<T> BuildMessage(T entity);
}
public abstract class HtmlMessageObject<T> : BaseMessageObject<T> 
   where T : Entity
{
  public override abstract BaseMessageObject<T> BuildMessage(T entity);
}
public class SocialSecurityVerificationHtmlMessageObject<T>:HtmlMessageObject<T>
   where T : SomeConcreteEntity
{
   public override BaseMessageObject<T> BuildMessage(T entity)
   {
      SocialSecurityVerificationHtmlMessageObject<T> message = 
            new SocialSecurityVerificationHtmlMessageObject<T>();            
      //do some stuff to build the message
   }
}
public abstract class BaseMessageObject<T> where T : Entity
{        
   public string Message { get; set; }        
   public virtual BaseMessageObject<T> BuildMessage(T entity)
   {
      if (null == entity)
               throw new ArgumentNullException(entity)
      throw new NotImplemenetedException("");
   }
}
公共抽象类BaseMessageObject,其中T:Entity
{        
公共字符串消息{get;set;}
公共抽象BaseMessageObject构建消息(T实体);
}
您有一个HTMLObjectMessages的基类,定义如下:

public abstract class BaseMessageObject<T> where T : Entity
{        
  public string Message { get; set; }        
  public abstract BaseMessageObject<T> BuildMessage(T entity);
}
public abstract class HtmlMessageObject<T> : BaseMessageObject<T> 
   where T : Entity
{
  public override abstract BaseMessageObject<T> BuildMessage(T entity);
}
public class SocialSecurityVerificationHtmlMessageObject<T>:HtmlMessageObject<T>
   where T : SomeConcreteEntity
{
   public override BaseMessageObject<T> BuildMessage(T entity)
   {
      SocialSecurityVerificationHtmlMessageObject<T> message = 
            new SocialSecurityVerificationHtmlMessageObject<T>();            
      //do some stuff to build the message
   }
}
public abstract class BaseMessageObject<T> where T : Entity
{        
   public string Message { get; set; }        
   public virtual BaseMessageObject<T> BuildMessage(T entity)
   {
      if (null == entity)
               throw new ArgumentNullException(entity)
      throw new NotImplemenetedException("");
   }
}
公共抽象类HtmlMessageObject:BaseMessageObject
其中T:实体
{
公共覆盖抽象BaseMessageObject构建消息(T实体);
}
您有一个HtmlMessage的具体实现,如下所示:

public abstract class BaseMessageObject<T> where T : Entity
{        
  public string Message { get; set; }        
  public abstract BaseMessageObject<T> BuildMessage(T entity);
}
public abstract class HtmlMessageObject<T> : BaseMessageObject<T> 
   where T : Entity
{
  public override abstract BaseMessageObject<T> BuildMessage(T entity);
}
public class SocialSecurityVerificationHtmlMessageObject<T>:HtmlMessageObject<T>
   where T : SomeConcreteEntity
{
   public override BaseMessageObject<T> BuildMessage(T entity)
   {
      SocialSecurityVerificationHtmlMessageObject<T> message = 
            new SocialSecurityVerificationHtmlMessageObject<T>();            
      //do some stuff to build the message
   }
}
public abstract class BaseMessageObject<T> where T : Entity
{        
   public string Message { get; set; }        
   public virtual BaseMessageObject<T> BuildMessage(T entity)
   {
      if (null == entity)
               throw new ArgumentNullException(entity)
      throw new NotImplemenetedException("");
   }
}
公共类社会安全验证HtmlMessageObject:HtmlMessageObject
其中T:someconcrete实体
{
公共覆盖BaseMessageObject构建消息(T实体)
{
社会安全验证HTMLMessageObject消息=
新的社会安全验证HTMLMessageObject();
//做一些事情来构建消息
}
}
在基本MessageObject中放置保护子句是否有任何危害,如下所示:

public abstract class BaseMessageObject<T> where T : Entity
{        
  public string Message { get; set; }        
  public abstract BaseMessageObject<T> BuildMessage(T entity);
}
public abstract class HtmlMessageObject<T> : BaseMessageObject<T> 
   where T : Entity
{
  public override abstract BaseMessageObject<T> BuildMessage(T entity);
}
public class SocialSecurityVerificationHtmlMessageObject<T>:HtmlMessageObject<T>
   where T : SomeConcreteEntity
{
   public override BaseMessageObject<T> BuildMessage(T entity)
   {
      SocialSecurityVerificationHtmlMessageObject<T> message = 
            new SocialSecurityVerificationHtmlMessageObject<T>();            
      //do some stuff to build the message
   }
}
public abstract class BaseMessageObject<T> where T : Entity
{        
   public string Message { get; set; }        
   public virtual BaseMessageObject<T> BuildMessage(T entity)
   {
      if (null == entity)
               throw new ArgumentNullException(entity)
      throw new NotImplemenetedException("");
   }
}
公共抽象类BaseMessageObject,其中T:Entity
{        
公共字符串消息{get;set;}
公共虚拟BaseMessageObject构建消息(T实体)
{
if(null==实体)
抛出新ArgumentNullException(实体)
抛出新的NotImplementedException(“”);
}
}

这感觉有些不对劲。是否应该对其进行重构?

我会这样做:

public abstract class BaseMessageObject<T> where T : Entity
{        
   public string Message { get; set; }        

   public BaseMessageObject<T> BuildMessage(T entity)
   {
        if (null == entity)
               throw new ArgumentNullException(entity)
        BuildMessageCore (entity);
   }

   protected abstract BaseMessageObject<T> BuildMessageCore(T entity);
}
公共抽象类BaseMessageObject,其中T:Entity
{        
公共字符串消息{get;set;}
公共BaseMessageObject构建消息(T实体)
{
if(null==实体)
抛出新ArgumentNullException(实体)
核心(实体);
}
受保护的抽象BaseMessageObject BuildMessageCore(T实体);
}
公共类社会安全验证HtmlMessageObject:HtmlMessageObject
其中T:someconcrete实体
是与基础的冲突

public abstract class BaseMessageObject<T>  
    where T : Entity
公共抽象类BaseMessageObject
其中T:实体
不同的地方是T。无法在继承的行中声明2个不同的类型参数

你能做到

public class SocialSecurityVerificationHtmlMessageObject<T> : HtmlMessageObject<SomeConcreteEntity> 
    where T : SomeConcreteEntity
公共类社会安全验证HtmlMessageObject:HtmlMessageObject
其中T:someconcrete实体
但问题是,您的基类永远不会知道T到底是什么。

您可以使用:

[ContractClass(typeof(BaseMessageObjectContract))]
公共抽象类BaseMessageObject,其中T:Entity{
公共字符串消息{get;set;}
公共抽象BaseMessageObject构建消息(T实体);
}
[ContractClassFor(typeof(BaseMessageObject))]
抽象类BaseMessageObjectContract:BaseMessageObject
其中T:实体{
公共重写BaseMessageObject构建消息(T实体){

合同。需要你的先决条件。

+1:似乎是合理使用。错误。如果
某个具体实体继承自
实体
,则没有冲突。